繁体   English   中英

如何使用boost :: date_time中启用了纳秒的boost :: thread :: timed_join?

[英]How can I use boost::thread::timed_join with nanoseconds enabled in 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";
    }
}

只要我没有打开纳秒级支持,一切都会按预期运行,但是一旦我取消注释了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软件包?

我在带有Boost 1.46.1的Ubuntu 12.04上运行。

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

显而易见的解决方案是决定放弃哪个更轻松:建立自己的助推器,或消除纳秒级的时间。

不太明显的“ hack”可能会或可能不会完全起作用,是编写您自己的timed_join包装器,该包装器带有一个线程对象和一个表示秒或ms或任何其他内容的int 然后,此功能将在没有其他任何东西的源文件中实现,并且出于调用已编译的boost二进制文件的特定目的,不会启用纳秒时间。 我再次强调,如果在任何时候您都无法完全隔离此类用法,则会违反一个定义规则,并且会遇到未定义的行为。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM