2013-02-22 39 views
2

这里是我的说明问题,最小expample一些C++代码:如何在boost :: date_time中启用nanoseconds的情况下使用boost :: thread :: timed_join?

// 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"; 
    } 
} 

只要我不打开纳秒的支持,预期寄托都工作正常,但只要我去掉所需的#define boost :: posix_time中的纳秒支持,程序不再通过if语句,就像我调用join()而不是timed_join()一样。

现在我已经想通了,发生这种情况是因为BOOST_DATE_TIME_POSIX_TIME_STD_CONFIG将时间戳的实际数据表示从单个64位整数更改为64 + 32位。很多增强的东西都是在头文件中完全实现的,但是线程方法并没有,因为它们不能适应新的数据格式,而没有用合适的选项再次编译它们。由于该代码旨在运行在外部服务器上,编译我自己的boost版本不是一种选择,也不会关闭纳秒支持。

因此我的问题如下:是否有一种方法可以在不使用不兼容的96位posix_time方法的情况下将值(秒数)传递给timed_join()而不需要修改标准boost程序包?

我在Ubuntu 12.04上运行,增加了1.46.1。

+0

请注意,timed_join在最近的boost版本中已弃用。 – inf 2013-02-22 20:14:11

回答

1

不幸的是我不认为你的问题可以像书面一样干净地解决。由于您链接的库是在没有纳秒支持的情况下编译的,根据定义,如果您碰巧对已经编译到库二进制文件中的任何片断启用纳秒支持,则违反了单定义规则。在这种情况下,您可以通过函数调用timed_join来启用它。

显而易见的解决方案是决定放弃哪个不那么痛苦:构建自己的提升或删除纳秒时间。

不太明显的“黑客”可能会或可能不会完全的工作就是写自己的timed_join包装,需要一个线程对象和int代表秒或毫秒或什么的。然后,此函数在源文件中实现,没有其他内容,并且不会为了调用编译的boost二进制文件的特定目的而启用纳秒。我再次强调,如果您在任何时候都未能完全隔离这些用法,就会违反一个定义规则并遇到未定义的行为。

相关问题