天天看點

unity 多線程

  

Thread.Sleep雖是靜态方法,但指的是目前線程

另外由于線程 睡眠/喚醒 需要時間

Thread.SpinWait反應速度度更快一些

我有必要 警告一下: Thread.SpinWait(10); //自旋10毫秒,性能會極差, CPU 會被占滿

我這邊有一個需求,不想使用 内置 Timer —— 是以需要線程休眠。

每隔10毫秒執行一次。

do{

Thread.SpinWait(10);  //自旋10毫秒

Thread.Sleep(10);       //休眠10毫秒

}while(true);

結果:Thread.SpinWait(10);  CPU被占滿 100% —— “自旋” (這個詞的意思 或許就是說:沒事做的時候,也要折騰一點事兒出來)。

——————————————————————

當然:

Thread.SpinWait(10);  精度準一點(沒有線程的 喚醒時間,休眠10ms,實際休眠 10.001 ms)

Thread.Sleep(10);  精度差一點(有線程的 喚醒時間,休眠10ms,實際休眠 10.1 ms)

MSDN解釋: SpinWait 方法在實作鎖定方面十分有用。.NET Framework 中的類(例如 Monitor 和 ReaderWriterLock)在内部使用此方法。SpinWait 實質上會将處理器置于十分緊密的循環中,其循環計數由 iterations 參數指定。是以,等待的持續時間取決于處理器的速度。 針對這一點,将此方法與 Sleep 方法進行對比。調用 Sleep 的線程會産生其處理器時間目前片斷的剩餘部分,即使指定的時間間隔為零也不例外。如果為 Sleep 指定非零的時間間隔,則線程計劃程式會不考慮該線程,直到該時間間隔結束。

值得注意的是SpinWait隻有在SMP或多核CPU下才具有使用意義。在單處理器下,旋轉非常浪費CPU時間,沒有任何意義。

<a href="http://www.cnblogs.com/xiaobaidhg/archive/2006/08/04/468005.html">為什麼調用thread.Abort(),線程不會馬上停止</a>

下面我們來解釋一下Abort()方法是如何工作的。因為公用語言運作時管理了所有的托管的線程,同樣它能在每個線程内抛出異常。Abort()方法能在目标線程中抛出一個ThreadAbortException異常進而導緻目标線程的終止。不過Abort()方法被調用後,目标線程可能并不是馬上就終止了。因為隻要目标線程正在調用非托管(托管也是一樣)的代碼而且還沒有傳回的話,該線程就不會立即終止。而如果目标線程在調用非托管的代碼而且陷入了一個死循環的話,該目标線程就根本不會終止。不過這種情況隻是一些特例,更多的情況是目标線程在調用托管的代碼,一旦Abort()被調用那麼該線程就立即終止了。

繼續閱讀