以下是一些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。
答案 0 :(得分:1)
不幸的是,我不认为你的问题可以像写的那样彻底解决。由于您链接的库是在没有纳秒支持的情况下编译的,因此根据定义,如果您碰巧为已编译到库二进制文件中的任何部分启用纳秒支持,则会违反单定义规则。在这种情况下,您可以在timed_join
的函数调用中启用它。
显而易见的解决方案是决定放弃哪些不那么痛苦:建立自己的提升,或者去除纳秒次。
不太明显的“hack”可能会或者可能不会完全起作用,就是编写自己的timed_join
包装器,它接受一个线程对象和int
表示秒或ms或其他什么。然后,此函数在没有其他任何内容的源文件中实现,并且为了调用已编译的boost二进制文件的特定目的而不启用纳秒时间。我再次强调,如果在任何时候你未能完全隔离这些用法,你将违反一个定义规则并遇到未定义的行为。