2009-12-30 67 views
5

我知道託管線程不保證在同一個操作系統線程上運行。託管線程切換操作系統線程的頻率如何?

如果CLR可能會在OS線程之間切換託管線程,這種情況發生的頻率如何?什麼影響頻率?

我有一個separate question關於如何停止切換髮生。對我而言,二等獎將不會發生得太頻繁(每分鐘少於一次就可以)。

回答

7

它完全取決於主機。對於任何特定的主機,可能發生線程切換的時間或地點(如果有的話)不能保證。

然而,由於.NET 2.0中,你已經能夠調用靜態BeginThreadAffinity方法來通知運行的代碼依賴於底層的操作系統線程的標識主機:

http://msdn.microsoft.com/en-us/library/system.threading.thread.beginthreadaffinity(VS.80).aspx

當然,確保在線程完成時調用EndThreadAffinity方法(我不確定在沒有調用EndThreadAffinity的情況下讓線程結束會發生什麼情況,我無法想象它會產生影響,但最好是國際海事組織):

http://msdn.microsoft.com/en-us/library/system.threading.thread.endthreadaffinity(VS.80).aspx

4

據我所知,CLR的當前實現將託管線程映射到OS線程。但是,正如文檔所說,這不能保證,即它是一個實現細節,所以你不能假設任何東西。它可能會改變,但即使它不是文檔的建議,也不應該依賴於一對一的映射。

由於casperOne指出你可以設置線程親和力,但除此之外,沒有保證。