使用 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 或使用事件/信號量等待工作線程完成後再讀取,可觀測到最終一致結果。