簡體   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