最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

c++11中關于std::thread的join的詳解

 更新時間:2019年03月22日 09:09:47   作者:那一抹風  
這篇文章主要介紹了c++11中關于std::thread的join詳解,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧

std::thread是c++11新引入的線程標準庫,通過其可以方便的編寫與平臺無關的多線程程序,雖然對比針對平臺來定制化多線程庫會使性能達到最大,但是會喪失了可移植性,這樣對比其他的高級語言,可謂是一個不足。終于在c++11承認多線程的標準,可謂可喜可賀?。?!

在使用std::thread的時候,對創(chuàng)建的線程有兩種操作:等待/分離,也就是join/detach操作。join()操作是在std::thread t(func)后“某個”合適的地方調用,其作用是回收對應創(chuàng)建的線程的資源,避免造成資源的泄露。detach()操作是在std::thread t(func)后馬上調用,用于把被創(chuàng)建的線程與做創(chuàng)建動作的線程分離,分離的線程變?yōu)楹笈_線程,其后,創(chuàng)建的線程的“死活”就與其做創(chuàng)建動作的線程無關,它的資源會被init進程回收。

在這里主要對join做深入的理解。

由于join是等待被創(chuàng)建線程的結束,并回收它的資源。因此,join的調用位置就比較關鍵。比如,以下的調用位置都是錯誤的。

void test()
{
}

bool do_other_things()
{
}

int main()
{
  std::thread t(test);
  int ret = do_other_things();
  if(ret == ERROR) {
    return -1;
  }

  t.join();
  return 0;
}

很明顯,如果do_other_things()函數調用返ERROR, 那么就會直接退出main函數,此時join就不會被調用,所以線程t的資源沒有被回收,造成了資源泄露。

例子二:

void test()
{
}

bool do_other_things()
{
}

int main()
{
  std::thread t(test);

  try {
    do_other_things();
  }
  catch(...) {
    throw;
  }
  t.join();
  return 0;
}

這個例子和例子一差不多,如果調用do_other_things()函數拋出異常,那么就會直接終止程序,join也不會被調用,造成了資源沒被回收。

那么直接在異常捕捉catch代碼塊里調用join就ok啦。

例子三:

void test()
{
}

bool do_other_things()
{
}

int main()
{
  std::thread t(test);

  try {
    do_other_things();
  }
  catch(...) {
    t.join();
    throw;
  }
  t.join();
  return 0;
}

是不是很多人這樣操作?這樣做不是萬無一失的, try/catch塊只能夠捕捉輕量級的異常錯誤,在這里如果在調用do_other_things()時發(fā)生嚴重的異常錯誤,那么catch不會被觸發(fā)捕捉異常,同時造成程序直接從函數調用?;厮莘祷兀膊粫{用到join,也會造成線程資源沒被回收,資源泄露。

所以在這里有一個方法是使用創(chuàng)建局部對象,利用函數調用棧的特性,確保對象被銷毀時觸發(fā)析構函數的方法來確保在主線程結束前調用join(),等待回收創(chuàng)建的線程的資源。

class mythread {
private:
  std::thread &m_t;

public:
  explicit mythread(std::thread &t):m_t(t){}
  ~mythread() {
    if(t.joinable()) {
      t.join()
    }
  }

  mythread(mythread const&) = delete;
  mythread& operate=(mythread const&) = delete;
}

void test()
{
}

bool do_other_things()
{
}

int main()
{
  std::thread t(test);
  mythread q(t);

  if(do_other_things()) {
    return -1;
  }

  return 0;
}

在上面的例子中,無論在調用do_other_things()是發(fā)生錯誤,造成return main函數,還是產生異常,由于函數調用棧的關系,總會回溯的調用局部對象q的析構函數,同時在q的析構函數里面先判斷j.joinable()是因為join操作對于同一個線程只能調用一次,不然會出現(xiàn)錯誤的。這樣,就可以確保線程一定會在主函數結束前被等待回收了。

以上所述是小編給大家介紹的c++11中關于std::thread的join詳解整合,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復大家的。在此也非常感謝大家對腳本之家網站的支持!

相關文章

  • 一篇文章帶你了解論C語言中算法的重要性

    一篇文章帶你了解論C語言中算法的重要性

    最近一直在學數據結構與算法,深深的感受到我們學習語言,永遠都只是一項工具,方法才是其中最重要的部分。這篇文章我將會通過幾個例子來說明算法,也就是寫程序的思路在程序中的重要意義
    2021-08-08
  • C語言文件復制實例詳解

    C語言文件復制實例詳解

    這篇文章主要介紹了C語言文件復制實例詳解的相關資料,需要的朋友可以參考下
    2017-06-06
  • 用C語言程序判斷大小端模式

    用C語言程序判斷大小端模式

    本文介紹了用C語言程序判斷大小端的方法,與大家分享一下。
    2013-04-04
  • C++使用數組來實現(xiàn)哈夫曼樹

    C++使用數組來實現(xiàn)哈夫曼樹

    給定N個權值作為N個葉子結點,構造一棵二叉樹,若該樹的帶權路徑長度達到最小,稱這樣的二叉樹為最優(yōu)二叉樹,也稱為哈夫曼樹(Huffman?Tree)。哈夫曼樹是帶權路徑長度最短的樹,權值較大的結點離根較近
    2022-05-05
  • C++使用ADO實現(xiàn)存取圖片的方法

    C++使用ADO實現(xiàn)存取圖片的方法

    這篇文章主要介紹了C++使用ADO實現(xiàn)存取圖片的方法,需要的朋友可以參考下
    2014-07-07
  • 手把手教你用C語言實現(xiàn)三子棋

    手把手教你用C語言實現(xiàn)三子棋

    三子棋是黑白棋的一種。三子棋是一種民間傳統(tǒng)游戲,又叫九宮棋、圈圈叉叉、一條龍、井字棋等。這篇文章就教你如何用C語言實現(xiàn)三子棋的功能
    2021-08-08
  • C語言超詳細講解指針與結構體

    C語言超詳細講解指針與結構體

    指針提供了對地址操作的一種方法,因此,使用指針可使得C語言能夠更高效地實現(xiàn)對計算機底層硬件的操作。另外,通過指針可以更便捷地操作數組。C數組允許定義可存儲相同類型數據項的變量,結構是C編程中另一種用戶自定義的可用的數據類型,它允許您存儲不同類型的數據項
    2022-05-05
  • C語言統(tǒng)計字符個數代碼分享

    C語言統(tǒng)計字符個數代碼分享

    本文給大家分享的是2則C語言實現(xiàn)統(tǒng)計字符個數的代碼,非常的簡單實用,小伙伴們根據自己的項目需求自由選擇吧。
    2015-07-07
  • Qt利用QNetwork實現(xiàn)上傳數據的示例代碼

    Qt利用QNetwork實現(xiàn)上傳數據的示例代碼

    這篇文章主要為大家詳細介紹了Qt如何利用QNetwork實現(xiàn)上傳數據的 功能,文中的示例代碼講解詳細,感興趣的小伙伴可以跟隨小編一起學習一下
    2023-02-02
  • C語言使用結構體實現(xiàn)簡單通訊錄

    C語言使用結構體實現(xiàn)簡單通訊錄

    這篇文章主要為大家詳細介紹了C語言使用結構體實現(xiàn)簡單通訊錄,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-02-02

最新評論

山东| 谢通门县| 东明县| 海淀区| 理塘县| 嵊州市| 垣曲县| 资中县| 饶河县| 永清县| 宁国市| 勐海县| 建瓯市| 渭源县| 南投市| 牙克石市| 潍坊市| 灌阳县| 班戈县| 固始县| 襄城县| 楚雄市| 江北区| 冕宁县| 宜丰县| 海伦市| 淳安县| 平谷区| 宜君县| 金乡县| 葫芦岛市| 万荣县| 灯塔市| 中宁县| 武汉市| 苏尼特右旗| 新竹市| 武冈市| 米脂县| 来凤县| 通江县|