我正在开发一个小线程库,但遇到了问题。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)
条件变量等待有时会导致虚假唤醒。因此,您必须在循环中使用它们:
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
是否为负或非常小,并考虑使用绝对超时。
归档时间: |
|
查看次数: |
2520 次 |
最近记录: |