簡體   English   中英

如何使用boost :: date_time中啟用了納秒的boost :: thread :: timed_join?

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

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM