c++ - 如何在 boost::date_time 中启用纳秒的情况下使用 boost::thread::timed_join?

标签 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";
    }
}

只要我不打开纳秒支持,一切都会按预期工作,但是一旦我取消注释 boost::posix_time 中纳秒支持所需的#define,程序就不会通过 if 语句就好像我调用了 join() 而不是 timed_join() 一样。

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

因此我的问题如下:有没有办法在不使用不兼容的 96 位 posix_time 方法且不修改标准提升包的情况下将值(以秒为单位)传递给 timed_join()?

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

最佳答案

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

显而易见的解决方案是决定放弃哪个更不痛苦:建立自己的提升,还是消除纳秒级时间。

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

关于c++ - 如何在 boost::date_time 中启用纳秒的情况下使用 boost::thread::timed_join?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15031356/

相关文章:

c++ - 对 boost::asio::io_context::run() 和 boost::thread::join() 感到困惑

c++ - 如何将函数参数传递给 boost::thread_groups::create_thread()

c++ - boost::posix_time::from_iso_string 允许错误输入

c++ - "Sprintf"删除分配给调用中未调用的变量的值

C++:比较 if 语句中的十进制值

c++ - gcc 4.4.6 上的原子变量非常慢

c++ - Boost::thread 如何获取指向调用我的函数的线程的指针?

c++ - 如何根据 RFC 3339 格式化 boost::date_time-object

c++ - boost::gregorian input_facet 意外结果

c++ - "Nested"带括号的类模板参数推导 : GCC vs. clang