如何在boost :: date_time中使用boost :: thread :: timed_join并启用纳秒?

时间:2013-02-22 19:01:51

标签: c++ boost-thread boost-date-time

以下是一些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";
    }
}

只要我没有按预期开启纳秒支持everthing工作,但只要我取消注释boost :: posix_time中纳秒支持所需的#define,程序就不会超过if语句更多,就像我调用了join()而不是timed_join()。

现在我已经发现,这是因为BOOST_DATE_TIME_POSIX_TIME_STD_CONFIG将时间戳的实际数据表示从单个64位整数更改为64 + 32位。很多提升内容完全在头文件中实现,但是线程方法不是,因为它们不能适应新的数据格式而不用适当的选项再次编译它们。由于代码是在外部服务器上运行的,因此编译我自己的boost版本不是一种选择,也不能关闭纳秒支持。

因此我的问题如下:有没有办法将值(大约为秒)传递给timed_join()而不使用不兼容的96位posix_time方法而不修改标准的boost包?

我在Ubuntu 12.04上运行,增强1.46.1。

1 个答案:

答案 0 :(得分:1)

不幸的是,我不认为你的问题可以像写的那样彻底解决。由于您链接的库是在没有纳秒支持的情况下编译的,因此根据定义,如果您碰巧为已编译到库二进制文件中的任何部分启用纳秒支持,则会违反单定义规则。在这种情况下,您可以在timed_join的函数调用中启用它。

显而易见的解决方案是决定放弃哪些不那么痛苦:建立自己的提升,或者去除纳秒次。

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