[英]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.