等待System.Threading.Thread完成的Microsoft代码片段

本文关键字:Microsoft 代码 片段 System Threading Thread 等待 | 更新日期: 2023-09-27 17:53:41

我正在看微软MSDN参考页面关于修饰符"volatile",并且有点不确定他们提供的代码片段是如何等待线程完成执行的。

我知道这只是示例代码,并且线程完成得非常快,但我相信下面的代码对于试图理解线程的开发人员来说不是很好。

我相信微软实际上已经提供了一个代码片段,它将在代码中引入一个"紧密循环"。现在我很感激它不会影响这个代码片段(那么多),但是如果开发人员使用这段代码并试图将其用于一些更密集的多线程代码,我想"紧密循环"问题会出现吗?

using System;
using System.Threading;
class Test
{
   public static int result;   
   public static volatile bool finished;
   static void Thread2() {
      result = 143;    
      finished = true; 
   }
   static void Main() {
      finished = false;
      // Run Thread2() in a new thread
      new Thread(new ThreadStart(Thread2)).Start();
      // Wait for Thread2 to signal that it has a result by setting
      // finished to true.
      for (;;) {
         if (finished) {
            Console.WriteLine("result = {0}", result);
            return;
         }
      }
   }
}

片段参考:http://msdn.microsoft.com/en-gb/library/aa645755 (v = vs.71) . aspx

在上面的例子中,等待线程完成的更好的方法是什么,它不会引入这种"紧密循环"的情况?

或者,实际上根本不会引入"闭环"?

请注意,该代码段的目的是演示"volatile"关键字,因此我认为使用Thread.Join()会使代码段脱离上下文。

等待System.Threading.Thread完成的Microsoft代码片段

这段代码没有说明如何等待,只是说明从不同的线程访问volatile字段。

要简单地等待后台线程,可以使用以下代码段:
AutoResetEvent autoEvent = new AutoResetEvent(false);
ThreadPool.QueueUserWorkItem((o) =>
                              {
                                   // do your stuff
                                   ((AutoResetEvent)o).Set();
                              }, autoEvent);
autoEvent.WaitOne();

正如您所说,等待线程完成的最佳方法是使用thread。Join或ManualResetEventSlim事件,但是它们都不需要volatile bool。

可以通过添加对Thread的调用来使用示例中的代码。在循环中SpinWait。这将有助于防止处理器耗尽。在。net版本4中,微软增加了一个名为SpinWait的结构体,可以更有效地使用它。

关于这方面的更多信息,请参见Joseph Albahari的"c#中的线程"