我有一個跨平臺的C++程序,我使用boost庫創建一個異步計時器。
我有一個全局變量:如果兩個線程同時訪問相同的bool變量會發生什麼情況?
bool receivedInput = false;
一個線程等待和處理輸入
string argStr;
while (1)
{
getline(cin, argStr);
processArguments(argStr);
receivedInput = true;
}
另一個線程運行的計時器,其中一個回調函數被每10秒調用。在該回調中,我檢查是否收到了消息
if (receivedInput)
{
//set up timer to fire again in 10 seconds
receivedInput = false;
}
else
exit(1);
那麼這是否安全?對於線程2中的讀取,我認爲這並不重要,因爲條件將評估爲真或假。但我不確定如果兩個線程嘗試同時設置receivedInput會發生什麼情況。我也讓我的計時器比我期望接收輸入的時間長3倍,所以我不擔心競賽狀況。
編輯: 爲了解決這個問題,我使用了boost :: unique_lock,當我設置receivedInput和boost :: shared_lock時,當我讀receivedInput。我用here的一個例子
¤如果你想知道它是否安全,那麼它不是。不管技術上是否安全,在線程的情況下,如果你不瞭解它,那麼即使它是完美的開始,它也會在短時間內發現錯誤。因爲它發生的代碼在技術上是不安全的,但實際上是安全的。例如,在技術上,當「輸入」線程處理七行時,「檢查」線程可能在「if」處暫停。但在實踐中,這不會發生,但是像Bad Things™*這樣的代碼將會發生。 :-)乾杯&hth。 –