在 Windows 平台使用 Peterson 演算法模擬兩執行緒互斥,開發者為了「確保單核執行」將兩個執行緒綁定至同一 CPU 核心(SetThreadAffinityMask(hThread, 1)),導致計數器達到 800 萬次以上時程式卡死數十分鐘無法結束。
雙執行緒搶佔同一邏輯核心:當兩個執行緒被強制綁定在同一 CPU 核心上,作業系統必須頻繁進行上下文切換。Peterson 演算法的 while(c2 && (will_wait == 1)) 忙等待迴圈會佔滿該核心的時間片,導致另一執行緒幾乎無法獲得執行機會,互斥邏輯退化為串行甚至活鎖,極大拖慢執行速度。
Sleep(0) 或 SwitchToThread() 主動讓出時間片,避免忙等待佔死核心。CRITICAL_SECTION)、互斥體(Mutex)等核心同步物件,而非手寫演算法。int main() {
HANDLE hFirst = CreateThread(NULL, 0, run1, NULL, 0, NULL);
HANDLE hSecond = CreateThread(NULL, 0, run2, NULL, 0, NULL);
// 刪除 SetThreadAffinityMask 調用,讓執行緒自然分佈
WaitForSingleObject(hFirst, INFINITE);
WaitForSingleObject(hSecond, INFINITE);
system("PAUSE");
return 0;
}
「綁定同一核心」看似能控制變因,實則破壞了多核並行優勢,並使忙等待演算法失效。多線程同步實驗應在多核環境下自然運行,或使用正規同步原語。