亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

用c ++ 11等效項替換boost :: thread和boost :: mutex是否明智?

用c ++ 11等效項替換boost :: thread和boost :: mutex是否明智?

C++
小唯快跑啊 2020-02-04 16:14:21
動機:我正在考慮的原因是,我的天才項目經理認為boost是另一種依賴,并且它很可怕,因為“您依賴它”(我試圖解釋boost的質量,然后過了一段時間就放棄了:( )。我之所以愿意這樣做的較小原因是我想學習c ++ 11的功能,因為人們將開始在其中編寫代碼。#include<thread> #include<mutex>和Boost等價物之間是否存在1:1映射?你會考慮一個好主意,以取代C ++ 11升壓的東西的東西。我的用法是原始的,但是有沒有一些示例說明std不提供什么功能呢?或者(褻瀆)反之亦然?PS我使用海灣合作委員會,所以頭在那里。
查看完整描述

3 回答

?
精慕HU

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_futurevs std::future

  • 參數傳遞的語義std::thread不同于boost::thread--- Boost使用boost::bind,后者需要可復制的參數。std::thread允許將僅移動類型std::unique_ptr作為參數傳遞。由于使用boost::bind,占位符的語義(例如_1嵌套綁定表達式中的語義)也可以不同。

  • 如果您未明確調用join(),detach()boost::thread析構函數和賦值運算符將調用detach()要銷毀/分配給的線程對象。對于C ++ 11 std::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,但這仍然是一個依賴項。


查看完整回答
反對 回復 2020-02-04
?
千巷貓影

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。


查看完整回答
反對 回復 2020-02-04
?
婷婷同學_

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。


查看完整回答
反對 回復 2020-02-04
  • 3 回答
  • 0 關注
  • 851 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號