以下是一些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的东西完全在头中实现,但线程方法没有,因此,如果不使用适当的选项再次编译它们,它们就无法适应新的数据格式。由于代码是在外部服务器上运行的,所以编译我自己的boost版本不是一种选择,也不是关闭纳秒级支持。
因此,我的问题如下:有没有一种方法可以将一个值(以秒为单位)传递给timed_join(),而不使用不兼容的96位posix_time方法,也不修改标准的boost包?
我在Ubuntu 12.04上运行,版本为1.46.1。
不幸的是,我认为您的问题不能像编写的那样干净地解决。由于您链接的库是在没有纳秒支持的情况下编译的,因此根据定义,如果您碰巧对已编译到库二进制文件中的任何部分启用纳秒支持,则违反了一个定义规则。在这种情况下,您将在对timed_join
的函数调用中启用它。
显而易见的解决方案是决定放弃哪一个不那么痛苦:建立自己的提升,还是消除纳秒时间。
不太明显的"破解"可能完全有效,也可能不完全有效,那就是编写自己的timed_join
包装器,该包装器接受一个线程对象和一个代表秒或毫秒的int
。然后,这个函数在一个源文件中实现,不需要其他任何东西,并且不能为调用编译后的boost二进制文件的特定目的启用纳秒时间。我想再次强调,如果在任何时候你不能完全隔离这些用法,你就会违反一个定义规则,并遇到未定义的行为。