簡體   English   中英

你什么時候應該使用std :: thread :: joinable?

[英]When should you use std::thread::joinable?

關於std :: thread :: joinable的網站cppreference中陳述了:

檢查線程對象是否標識了活動的執行線程。 具體來說,如果get_id()!= std :: thread :: id(),則返回true。 因此默認構造的線程不可連接。 已完成執行代碼但尚未加入的線程仍被視為活動執行線程,因此可以連接。

關於std :: thread :: join文檔的內容如下:

錯誤條件

resource_deadlock_would_occur如果this-> get_id()== std :: this_thread :: get_id()(檢測到死鎖)

這種方法的唯一目的是檢測這種情況嗎? 我們目前肆無忌憚地只調用thread-> join而沒有可連接的包裝器,這種方法有什么危險?

您可以使用joinable ,當你有一個std::thread可能已經被加入了對象,也可以不引用實際的牛逼 hread 華氏度 éxecution(TOE -即OS線程),並且你想加入它,如果不是已經加入。

例如,如果你正在實現建議的joinable_thread類,那么析構函數會說if(thr.joinable()) thr.join(); ,以涵蓋有人已經明確join的情況。

根據您引用的信息:

因此默認構造的線程不可連接。

有你的答案。 如果你不知道你的線程是否是默認構造的,你不知道它是否可以連接。

因此,在程序/函數/例程的末尾,當您想要加入線程時(並且您需要在std::thread超出范圍之前執行此操作),您必須有條件地執行此操作。 這就是你如何做到的。

#include <thread>

void bar(const unsigned int);

/**
 * This class may be default-constructed (in which case it does nothing),
 * or constructed with an `unsigned int` argument which shall be passed
 * to `bar()` in a worker thread.
 */
struct Foo
{
   Foo() {}

   Foo(const unsigned int x)
      : doThingsThread([&]() { bar(x); })
   {}

   ~Foo()
   {
      // The thread *MUST* be joined before destruction, if it
      // is joinable. Otherwise, it *CAN'T* be joined.
      if (doThingsThread.joinable())
         doThingsThread.join();
   }
private:
   std::thread doThingsThread;
};

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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