[英]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.