【发布时间】:2011-12-07 00:57:21
【问题描述】:
我有一个跨平台的 c++ 程序,我在其中使用 boost 库来创建一个异步计时器。
我有一个全局变量:
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,在读取接收输入时使用了 boost::shared_lock。我使用了来自here的示例
【问题讨论】:
-
¤ 如果您想知道它是否安全,那么它不是。无论某些东西在技术上是否安全,线程的情况是这样的,如果你不理解它,那么即使它一开始就完美,它也会在短时间内产生错误。碰巧的是,代码在技术上是不安全的,但实际上是安全的。例如,从技术上讲,“检查”线程可能在
if处暂停,而“输入”线程处理了七行。但实际上这不会发生,但使用像 Bad Things™ 这样的代码将发生。 :-) 干杯&hth。
标签: c++ multithreading timer boost-asio