timed_wait does not wait
timed_wait does not wait
我在Linux操作系统+ ARM处理器+ boost 1.51上运行以下代码。但是,代码没有按预期工作,timmed_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 waitn", 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 waitn", 20After 1 second wait) = 20
代码不能正常工作的系统:
write(1, "Before 1 second waitn", 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 waitn", 20After 1 second wait) = 20
是否有一个内核/glibc的变化,需要得到这个代码的工作?
在使用超时时,为什么不使用实际超时来代替时钟呢?
condition.timed_wait(lock,boost::posix_time::milliseconds(1000))
通过将超时从1更改为100,我能够弄清楚发生了什么。
我将超时作为参数传递给程序,并使用
xt.sec += timeout;
当timeout大于26时,程序等待(timeout - 26)秒。换句话说,程序等待1秒:如果timeout为27,则等待2秒:如果timeout为28,以此类推…
偏移量26来自于闰秒数。如果系统上的时区信息包含闰秒信息,那么我们就会看到这个问题。如果我更改时区信息(/etc/localtime)指向一个没有闰秒信息的zoneinfo文件,那么,boost API可以正常工作。
相关文章:
- std::condition_variable::wait()如何评估给定的谓词
- std::atomic和std::condition_variable wait,notify_*方法之间的区别
- OpenMP卸载说'fatal error: could not find accel/nvptx-none/mkoffload'
- std::memory_order for std::atomic:<T>:wait
- 使用JsonCpp将数据返回到带有pybind11的python会在python调用中产生Symbol not foun
- OpenCV Android C++ imwrite not found
- 应用程序崩溃并显示"symbol _ZdlPvm, version Qt_5 not defined in file libQt5Core.so.5 with link time reference"
- 使用单词"not"作为C ++类的名称会导致VS2019错误
- 错误"Could not find Boost"(缺少:上下文标头)
- 如何修复"error: ‘_1’ was not declared in this scope"?
- 套接字连接"Operation not permitted"错误,甚至使用升压/平发器根.cpp
- Is !NaN not a NaN?
- 为什么我会" void value not ignored as it ought to be"?
- 解决"ld: library not found for -ltensorflow_framework.2.3.0"
- 加载与引用 .NET DLL 位于同一文件夹中的引用的 .NET DLL 时"Not found"异常
- Directx 11 - CompileFromFile() is not compiling
- 方法错误"not all control paths return a value"和方法不返回值
- Centos7 g++ "to_string is not in a member of std"
- WaitNamedPipe does not wait
- timed_wait does not wait