全局 bool bflag 在線程執行某對象函數後發生變化,但該函數內無賦值代碼。經排查,發現 TimeOut() 函數中對其重新賦值且未加鎖,且在睡眠期間可能被其他線程通過消息機制觸發修改。
bool 讀寫在某些架構上非原子,可能發生撕裂讀寫。mutex/atomic 保護。sleep() 期間消息泵處理其他消息,間接調用修改該標誌的函數。std::atomic<bool> (C++11)std::atomic bflag{false};
// 線程 A
bflag.store(true, std::memory_order_release);
// 線程 B
if (bflag.load(std::memory_order_acquire)) { ... }
std::mutex mtx;
bool bflag = false;
// 寫入
{
std::lock_guard lock(mtx);
bflag = true;
}
// 讀取
bool val;
{
std::lock_guard lock(mtx);
val = bflag;
}
std::condition_variable cv;
std::mutex mtx;
bool ready = false;
// 等待線程
std::unique_lock lk(mtx);
cv.wait(lk, []{ return ready; });
// 通知線程
{
std::lock_guard lock(mtx);
ready = true;
}
cv.notify_one();
atomic,複雜邏輯用鎖 + 條件變量。TSAN (ThreadSanitizer) 檢測數據競爭。通過原子操作或鎖機制保護共享標誌,並梳理調用鏈消除隱式修改,即可解決多線程下布爾變量異常變化問題。