2011-06-16 80 views
3

我想這個問題可以歸結爲「SpinWait vs. Block?」,但我想到可能有一個更有趣的答案,爲什麼幾乎每個C#線程教程提出以下電話:在等待新線程產生時調用thread.sleep()

Thread newThread = new Thread(new ThreadStart(ThreadMethod)); 
newThread.Start() 
while (!newThread.isAlive()) ; 
Thread.Sleep(1); // Allow the new thread to do some work 

相對於阻塞,像這樣:

Thread newThread = new Thread(new ThreadStart(ThreadMethod)); 
newThread.Start() 
while (!newThread.isAlive()) Thread.Sleep(1); 
Thread.Sleep(1); // Allow the new thread to do some work 

我非常強力測試(與周邊調用DateTime.Ticks while循環)並沒有真正顯示任何東西(說在兩種情況下差異是0滴答)。

線程創建過程是否足夠短以至於旋轉效率更高?或者大多數教程都建議旋轉,因爲它稍微更優雅,時間差異可以忽略不計?

回答

2

我不知道你爲什麼要用我的頭頂,我想不出任何阻止​​調用線程的用例,直到新線程還活着,因爲「活着」不會這並不意味着它已經執行了任何事情。如果在繼續執行調用線程之前需要等待一些代碼在新線程中運行,那麼您需要使用WaitHandle或SpinLock。

+0

的。一些資源(例如Windows消息隊列)綁定到創建它們的線程,因此不能在ctor中分配 - 它們必須由新線程分配。如果ctor不等待新線程分配這些資源,那麼線程可能會被要求執行一個將失敗的動作,因爲它尚未輪到分配資源。按照Dani的建議,將事件傳遞給線程是可以的。 – 2011-06-16 08:20:20

1

您可以讓線程在啓動時設置一個事件,並在事件上等待主線程。沒有spinwait沒有太久睡覺。