boost::condition_variable.timed_wait 立即返回

dut*_*utt 1 c++ boost-thread

我正在开发一个小线程库,但遇到了问题。boost::condition_variable.wait() 工作完美,但是 boost::condition_variable.timed_wait() 立即返回,它不会超时。

文档说它应该只在超时过去或被通知后返回。这是通知前的三秒等待,我已经尝试了 10 秒和 100 秒的超时,所以它应该在 3 秒后返回。

编辑:

boost::condition_variable waitCondition;
boost::mutex mMutex;

Message MessageClient::waitAsync(Message msg, bool waitForReply) {
   unique_lock<boost::mutex> lock(msg->mMutex);
   if(mSendTimeout.sec == 0)
       msg->waitCondition.wait(lock);
   else {
       timeout = msg->waitCondition.timed_wait(lock,  mSendTimeout);
       if(!timeout)
           return 0;

       if(waitForReply) {
          Message reply = receiveMessage();
          return reply;
       }
       else
          return 0;
}
Run Code Online (Sandbox Code Playgroud)

这是在 sendMessage 之后调用的。接收者收到消息,发送回复,然后调用

waitCondition.notify_all();
Run Code Online (Sandbox Code Playgroud)

bdo*_*lan 5

条件变量等待有时会导致虚假唤醒。因此,您必须在循环中使用它们:

while (someCondition)
  msg->waitCondition.wait(lock);
Run Code Online (Sandbox Code Playgroud)

使用 timed_wait 它稍微复杂一些,因为您必须重新计算超时以处理它所做的时间,实际上,等待。Boost 提供了一个带有谓词的变体,在给定绝对超时的情况下,它将为您执行循环:

msg->waitCondition.timed_wait(lock, absoluteTimeout, boost::lambda::var(someFlag));
Run Code Online (Sandbox Code Playgroud)

如果您仍然遇到问题,请检查它mSendTimeout是否为负或非常小,并考虑使用绝对超时。