2

这是一些 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 上运行。

4

1 回答 1

1

不幸的是,我不认为您的问题可以按照书面方式彻底解决。由于您要链接的库是在没有纳秒支持的情况下编译的,根据定义,如果您碰巧为已编译到库二进制文件中的任何片段启用纳秒支持,则您违反了单一定义规则。在这种情况下,您将在对timed_join.

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

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

于 2013-02-22T19:50:05.783 回答