这是一些 C++ 代码,用一个最小的例子说明了我的问题:
// uncomment the next line, to make it hang up:
//#define BOOST_DATE_TIME_POSIX_TIME_STD_CONFIG //needed for nanosecond support of boost
#include <boost/thread.hpp>
void foo()
{
while(true);
}
int main(int noParameters, char **parameterArray)
{
boost::thread MyThread(&foo);
if ( MyThread.timed_join( boost::posix_time::seconds(1) ) )
{
std::cout<<"\nDone!\n";
}
else
{
std::cerr<<"\nTimed out!\n";
}
}
只要我不打开纳秒支持,一切都会按预期工作,但是一旦我取消注释 boost::posix_time 中纳秒支持所需的#define ,程序就不会再通过 if 语句了,就好像我调用了 join() 而不是 timed_join()。
现在我已经发现,这是因为 BOOST_DATE_TIME_POSIX_TIME_STD_CONFIG 将时间戳的实际数据表示从单个 64 位整数更改为 64+32 位。在头文件中完全实现了很多提升的东西,但线程方法没有,因此它们无法适应新的数据格式,除非使用适当的选项再次编译它们。由于代码旨在在外部服务器上运行,因此编译我自己的 boost 版本不是一种选择,也不是关闭纳秒支持。
因此我的问题如下:有没有办法在不使用不兼容的 96 位 posix_time 方法并且不修改标准 boost 包的情况下将值(以秒为单位)传递给 timed_join()?
我在带有 boost 1.46.1 的 Ubuntu 12.04 上运行。