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

Windows 臨界區同步看似失效:主線程讀取過快導致觀測到中間狀態

     編輯:程式設計疑難解答

現象

使用 CRITICAL_SECTION 保護共享變量,但主線程讀取時兩值仍不同。

原因

臨界區確保了**互斥訪問**,但主線程在釋放鎖後**立即讀取**,可能讀到工作線程**尚未更新完**的值 (即中間狀態)。

代碼演示

CRITICAL_SECTION cs;
int a=0, b=0;
DWORD WINAPI Worker(LPVOID) {
    EnterCriticalSection(&cs);
    a = 1; Sleep(1); // 模擬耗時操作
    b = 1;
    LeaveCriticalSection(&cs);
    return 0;
}
int main() {
    InitializeCriticalSection(&cs);
    CreateThread(NULL,0,Worker,NULL,0,NULL);
    Sleep(10); // 等待工作線程進入
    EnterCriticalSection(&cs);
    // 此時 a=1, b=1 (工作線程已完成)
    LeaveCriticalSection(&cs);
    // 主線程這裡讀取 a,b 必為 1,1
    // 若主線程在工作線程 Sleep 期間讀取,會看到 a=1,b=0
    DeleteCriticalSection(&cs);
}

結論

同步機制正確,**觀測時機**導致看似不一致。添加 Sleep 或使用事件/信號量等待工作線程完成後再讀取,可觀測到最終一致結果。

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