首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計疑難解答

多線程互斥實驗:CPU 親和性設定導致效能災難

     編輯:程式設計疑難解答

問題背景

在 Windows 平台使用 Peterson 演算法模擬兩執行緒互斥,開發者為了「確保單核執行」將兩個執行緒綁定至同一 CPU 核心(SetThreadAffinityMask(hThread, 1)),導致計數器達到 800 萬次以上時程式卡死數十分鐘無法結束。

根本原因

雙執行緒搶佔同一邏輯核心:當兩個執行緒被強制綁定在同一 CPU 核心上,作業系統必須頻繁進行上下文切換。Peterson 演算法的 while(c2 && (will_wait == 1)) 忙等待迴圈會佔滿該核心的時間片,導致另一執行緒幾乎無法獲得執行機會,互斥邏輯退化為串行甚至活鎖,極大拖慢執行速度。

正確做法

  1. 移除親和性綁定,讓 OS 排程器自動將執行緒分派到不同核心,實現真正的並行。
  2. 若必須測試單核情境,應使用 Sleep(0) 或 SwitchToThread() 主動讓出時間片,避免忙等待佔死核心。
  3. 生產環境優先使用關鍵區(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;
}

經驗總結

「綁定同一核心」看似能控制變因,實則破壞了多核並行優勢,並使忙等待演算法失效。多線程同步實驗應在多核環境下自然運行,或使用正規同步原語。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved