我知道託管線程不保證在同一個操作系統線程上運行。託管線程切換操作系統線程的頻率如何?
如果CLR可能會在OS線程之間切換託管線程,這種情況發生的頻率如何?什麼影響頻率?
我有一個separate question關於如何停止切換髮生。對我而言,二等獎將不會發生得太頻繁(每分鐘少於一次就可以)。
我知道託管線程不保證在同一個操作系統線程上運行。託管線程切換操作系統線程的頻率如何?
如果CLR可能會在OS線程之間切換託管線程,這種情況發生的頻率如何?什麼影響頻率?
我有一個separate question關於如何停止切換髮生。對我而言,二等獎將不會發生得太頻繁(每分鐘少於一次就可以)。
它完全取決於主機。對於任何特定的主機,可能發生線程切換的時間或地點(如果有的話)不能保證。
然而,由於.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
據我所知,CLR的當前實現將託管線程映射到OS線程。但是,正如文檔所說,這不能保證,即它是一個實現細節,所以你不能假設任何東西。它可能會改變,但即使它不是文檔的建議,也不應該依賴於一對一的映射。
由於casperOne指出你可以設置線程親和力,但除此之外,沒有保證。