繁体   English   中英

Microsoft片段等待System.Threading.Thread完成

[英]Microsoft snippet waiting for a System.Threading.Thread to complete

我正在查看有关修饰符“ volatile”的Microsoft MSDN参考页,并且不确定它们提供的代码段等待线程完成执行的方式。

我知道这只是示例代码,并且线程可以很快完成,但是我认为下面的代码对于尝试理解线程的开发人员不是很好。

我相信微软实际上已经提供了一个代码片段,它将在代码中引入“紧密循环”。 现在,我意识到它不会(多少)影响此代码段,但是如果开发人员采用此代码并尝试将其用于强度更高的多线程代码,我将假定为“紧密循环”问题会出现吗?

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()会使该代码段脱离上下文。

此代码段未说明如何等待,仅说明了如何从不同的线程访问volatile字段。

要简单地等待您的后台线程,可以使用以下代码段:

AutoResetEvent autoEvent = new AutoResetEvent(false);
ThreadPool.QueueUserWorkItem((o) =>
                              {
                                   // do your stuff
                                   ((AutoResetEvent)o).Set();
                              }, autoEvent);
autoEvent.WaitOne();

正如您所说的,等待线程完成的最好方法是使用Thread.Join或ManualResetEventSlim事件,但是这两种方法都不要求使用易失性布尔值。

通过在循环中添加对Thread.SpinWait的调用,可以使用示例中的代码。 这将有助于防止处理器饥饿。 在.Net的版本4中,Microsoft添加了一个名为SpinWait的结构,该结构可以更有效地使用。

Joseph Albahari的“ C#中的线程”中有关于此的更多信息。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM