boost - timed_wait不等待

时间:2015-07-29 08:43:34

标签: c++ boost linux-kernel futex

我在Linux OS + ARM处理器+ boost 1.51上运行以下代码。但是,代码不能按预期工作,并且timed_wait()调用会立即返回。

#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()的调用不在系统不能正常工作的地方。

从代码正在运行的系统中删除:

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

来自代码不工作的系统:

    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才能使此代码正常工作?

2 个答案:

答案 0 :(得分:0)

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

condition.timed_wait(lock,boost::posix_time::milliseconds(1000))

这可以防止各种奇怪的问题。

答案 1 :(得分:0)

我能够通过将超时从1更改为100来弄清楚发生了什么。

我将超时作为参数传递给程序并使用

xt.sec += timeout;

当超时超过26时,程序正在等待(超时 - 26)秒。换句话说,程序等待1秒:如果超时为27秒,如果超时为28,依此类推......

偏移量26来自闰秒数。如果系统上的时区信息包含闰秒信息,那么我们就会看到这个问题。如果我将时区信息(/ etc / localtime)更改为指向没有闰秒信息的zoneinfo文件,则boost API可以正常工作。