當您在多核心處理器上啟動多個執行緒時,是否保證它們由不同的核心處理?

當您在多核心處理器上啟動多個執行緒時,是否保證它們由不同的核心處理?

我有一個 Pentium core i5 處理器,有 4 個核心。如果我在 C# 控制台程式中執行此操作

var t1 = new Thread(Thread1);
var t2 = new Thread(Thread2);
t1.Start();
t2.Start();

t1 和 t2 執行緒是否保證在單獨的核心上運行?

答案1

您無法保證在 .Net 中兩個Threads 運行在兩個單獨的核心上。實際上,您也不能保證它Thread只能在一個核心上運作(!)

這是因為託管線程與作業系統線程不同- 單一託管執行緒可以使用多個作業系統執行緒來支援它。在 C# 中,您只能直接與託管物件Thread打交道(至少,不訴諸 p/invoke 來呼叫 WinAPI 執行緒函數,這是你永遠不應該做的)

然而,.Net 和 Windows 執行緒調度程式非常擅長它們的工作 - 當第二個核心完全空閒時,它們不會在單一核心上運行兩個執行緒。所以,一般來說,你不需要擔心這個問題。

答案2

不,作業系統和 CPU 將決定運行什麼以及何時運行。在您展示的簡單範例中,排除其他任務,是的,這些任務很可能在單獨的核心上並行運行,但很少保證會發生這種情況。

您可以使用執行緒親和力嘗試對給定線程的核心分配進行一些控制。

還考慮調度優先權根據哪些線程應該完全並行、哪些線程可以等待來堆疊甲板。

相關內容