3 回答

TA貢獻1845條經驗 獲得超8個贊
Boost.Thread和C ++ 11標準線程庫之間有一些區別:
Boost支持線程取消,C ++ 11線程不支持
C ++ 11支持
std::async
,但Boost不支持Boost具有
boost::shared_mutex
用于多讀者/單作家的鎖定。類似的std::shared_timed_mutex
僅可自C ++ 14(N3891),而std::shared_mutex
僅可自C ++ 17(N4508)。C ++ 11超時與Boost超時不同(盡管現在應該很快改變,現在Boost.Chrono已被接受)。
一些名稱是不同的(例如
boost::unique_future
vsstd::future
)參數傳遞的語義
std::thread
不同于boost::thread
--- Boost使用boost::bind
,后者需要可復制的參數。std::thread
允許將僅移動類型std::unique_ptr
作為參數傳遞。由于使用boost::bind
,占位符的語義(例如_1
嵌套綁定表達式中的語義)也可以不同。如果您未明確調用
join()
,detach()
則boost::thread
析構函數和賦值運算符將調用detach()
要銷毀/分配給的線程對象。對于C ++ 11std::thread
對象,這將導致std::terminate()
對應用程序的調用并中止該應用程序。
為了闡明僅移動參數的要點,以下是有效的C ++ 11,并將所有權int
從臨時std::unique_ptr
轉移到f1
新線程啟動時的參數。但是,如果您使用boost::thread
它,則它將無法使用,因為它在boost::bind
內部使用,并且std::unique_ptr
無法復制。GCC隨附的C ++ 11線程庫中還有一個錯誤,阻止了此工作,因為它std::bind
也在實現中使用。
void f1(std::unique_ptr<int>);std::thread t1(f1,std::unique_ptr<int>(new int(42)));
如果使用的是Boost,那么如果您的編譯器支持的話,您可能可以相對輕松地切換到C ++ 11線程(例如,Linux上的最新版本的GCC在-std=c++0x
模式下可用的C ++ 11線程庫的實現基本完整)。
如果您的編譯器不支持C ++ 11線程,則您可能能夠獲得第三方實現,例如Just :: Thread,但這仍然是一個依賴項。

TA貢獻1829條經驗 獲得超7個贊
std::thread
基本上是模仿的boost::thread
,有一些區別:
boost的不可復制的,一對一映射到一個OS線程的語義得以保留。但是該螺紋是可移動的,以允許從工廠功能返回螺紋并將其放入容器中。
該提議為加上了取消功能
boost::thread
,這是一個很大的麻煩。此更改不僅對線程有很大影響,而且對C ++線程庫的其余部分也有很大影響。據信,這種巨大的改變是有好處的,這是合理的。
現在,線程析構函數必須在分離之前調用cancel,以避免在取消父線程時意外泄漏子線程。
現在需要一個顯式的分離成員來啟用分離而不取消。
線程句柄和線程標識的概念已分為兩類(它們在中是同一類
boost::thread
)。這是為了支持更容易地操作和存儲線程標識。添加了創建線程ID的功能,該線程ID保證沒有其他可連接線程被比較(
boost::thread
不具有此功能)。這對于想要知道它是否由與先前調用相同的線程執行的代碼非常方便(遞歸互斥是一個具體的示例)。存在一個獲取本機線程句柄的“后門”,以便客戶端可以根據需要使用基礎操作系統來操縱線程。
這是從2007年開始的,因此某些要點不再有效:boost::thread
現在具有native_handle
功能,并且正如評論者所指出的,std::thread
不再具有取消功能。
我boost::mutex
和之間找不到任何重大差異std::mutex
。

TA貢獻1844條經驗 獲得超8個贊
企業案例
如果您正在為需要在中型到大型操作系統上運行的企業編寫軟件,并因此在這些操作系統上使用各種編譯器和編譯器版本(尤其是相對較舊的版本)進行構建,則我的建議是遠離現在完全是C ++ 11。這意味著您不能使用std::thread
,我建議您使用boost::thread
。
基本/技術啟動案例
如果您正在為一個或兩個操作系統編寫程序,那么您肯定會知道只需要使用主要支持C ++ 11(例如VS2015,GCC 5.3,Xcode 7)的現代編譯器進行編譯,而您還沒有取決于boost庫,那么std::thread
可能是一個不錯的選擇。
我的經驗
我個人偏向于強化,頻繁使用,高度兼容,高度一致的庫,例如boost與非?,F代的替代品。對于復雜的編程主題(例如線程)尤其如此。此外,我長期以來boost::thread
在各種各樣的環境,編譯器,線程模型等方面都取得了巨大的成功(總體而言,也是boost)。當我選擇它時,我選擇boost。
- 3 回答
- 0 關注
- 851 瀏覽
添加回答
舉報