首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >boost - timed_wait不等待

boost - timed_wait不等待
EN

Stack Overflow用户
提问于 2015-07-29 08:43:34
回答 1查看 1.3K关注 0票数 2

我在Linux操作系统+ ARM处理器+ boost 1.51上运行以下代码。但是,代码没有按预期工作,timed_wait()调用立即返回。

代码语言:javascript
复制
#include <boost/thread/condition.hpp>
#include <boost/thread/xtime.hpp>
#include <boost/thread/mutex.hpp>
#include <iostream>

using namespace std;

int main()
{
     boost::mutex mutex_;
     boost::mutex::scoped_lock lock( mutex_ );

     boost::xtime xt;
     boost::condition condition;

     // wait for one second or wait on lock
     boost::xtime_get(&xt, boost::TIME_UTC_);

     xt.sec += 1;

     cout << "Before 1 second wait" << endl;
     condition.timed_wait(lock, xt);
     cout << "After 1 second wait" << endl;

     return 0;
}

在具有相同ARM处理器但不同版本的Linux + glibc +相同boost 1.51库的其他系统上,代码工作正常,等待1秒。

我试着用strace调试这个问题。在对futex()的调用不起作用的系统中,我看到了一个不同的地方。

来自代码正在工作的系统的字符串:

代码语言:javascript
复制
write(1, "Before 1 second wait\n", 21Before 1 second wait)  = 21
futex(0xb6fbf0dc, FUTEX_WAKE_PRIVATE, 2147483647) = 0
clock_gettime(CLOCK_REALTIME, {1438150496, 732211544}) = 0
futex(0xbef07a44, FUTEX_WAIT_PRIVATE, 1, {0, 998193456}) = -1 ETIMEDOUT (Connection timed out)
futex(0xbef07a28, FUTEX_WAKE_PRIVATE, 1) = 0
write(1, "After 1 second wait\n", 20After 1 second wait)   = 20

从代码不起作用的系统中捕获:

代码语言:javascript
复制
    write(1, "Before 1 second wait\n", 21Before 1 second wait)  = 21
    futex(0xb6fc90dc, FUTEX_WAKE_PRIVATE, 2147483647) = 0
    clock_gettime(CLOCK_REALTIME, {1438150407, 134963583}) = 0
    futex(0xbe9be988, FUTEX_WAKE_PRIVATE, 1) = 0
    write(1, "After 1 second wait\n", 20After 1 second wait)   = 20

是否需要对内核/ glibc进行更改以使代码正常工作?

EN

回答 1

Stack Overflow用户

发布于 2015-07-29 08:55:10

为什么不使用一个实际的超时,而不是在使用超时时使用时钟呢?

代码语言:javascript
复制
condition.timed_wait(lock,boost::posix_time::milliseconds(1000))

这就防止了所有奇怪的问题。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31695487

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档