2015-04-17 43 views
8

可以混合使用boost::threadstd::thread之間的東西,還是應該爲每個功能使用一組功能?可以使用boost :: threads中的std :: this_thread *函數嗎?

我問,因爲我的代碼使用boost::thread S,但我發現,設置系統時間回來的時候boost::this_thread::sleep_for工作不正常,但std::this_thread::sleep_for呢,所以我想改變我的睡眠功能調用,避免改變如果可能的話,我所有的boost::thread s到std::thread

+3

混業經營將明確給予未定義行爲。如果你的標準庫像Boost's一樣使用足夠的代碼,它可能會工作,但我認爲它的可能性相當低(儘管當你不告訴我們你是什麼編譯器/庫時,甚至不可能做出有根據的猜測使用)。 –

+0

只是一個fyi,boost 1.58修復了你正在討論的睡眠錯誤(今天發佈) –

回答

1

在實踐中,你可能會忽略iff /因爲這些實現使用相同的實現(例如,linux上的pthread)。

但是,您打破不變式。簡單示例:Boost線程的中斷點不會與非增強同步基元(包括std::this_thread::sleep_*)一起工作。

所以我avice針對實際混合庫控制關係的關聯線程,免得你想冒險運行到suprises¹

當然,如果庫有完全獨立的擔憂(例如,它們使用線程內部,「在黑匣子中「),在一個過程中將這些庫結合起來應該沒有問題。


¹我可以看到死鎖發生,數據種族/泄漏不需要想象力未免(認爲線程本地數據的支持/ call_once的/ set_value_at_thread_exit ...)

1

在一個線程中混用API是不可取的。正如@Jerry Coffin所提到的,你很可能遇到未定義的行爲。這些API所依賴的線程本地狀態可能與其他API創建的線程不兼容。

但是,在一個過程中分別使用std::threadboost::thread應該沒問題。由於@紅色警報說1.58修復了這個錯誤,這應該可以解決你的問題。否則,您可以暫時恢復到usleep()以及#ifdef對不同平臺的類似功能。

+0

我認爲'usleep'仍然會破壞庫不變量;好處在於它使得這個更清晰。例如。很少有人會期望中斷點與神奇的'usleep'一起工作 – sehe

相關問題