boost:: condition_variable.time_wait立即返回

boost::condition_variable.timed_wait return immediately

本文关键字:返回 wait variable condition boost time      更新时间:2023-10-16

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

文档说它应该只在超时时间过去或被通知后返回。这是通知前的3秒等待,我已经尝试了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;
}

在sendMessage之后调用。接收方收到消息,发送回复,然后调用

waitCondition.notify_all();

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

while (someCondition)
  msg->waitCondition.wait(lock);

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

msg->waitCondition.timed_wait(lock, absoluteTimeout, boost::lambda::var(someFlag));

如果仍然有问题,检查mSendTimeout是否为负值或非常小,并考虑使用绝对超时