我有一个跨平台的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。 –