[英]C++11: How can I join a std::thread as soon as its execution function exits?
我有以下類,其std :: thread作為其成員字段之一:
class MyClass {
private:
std::thread auxThread;
void run();
public:
~MyClass();
void start();
}
MyClass:~MyClass() {
if (auxThread.joinable())
auxThread.join();
}
void MyClass::run() {
//do stuff
}
void MyClass::start() {
auxThread = std::thread (&MyClass::run, this); //Move assignment
}
我可以按需啟動auxThread,這要歸功於使用空構造函數初始化它,然后將其分配給與實際執行線程關聯的std :: thread對象(通過start()函數),但最小化系統資源用法我想在run()退出后立即加入()auxThread與主線程,即當auxThread的工作完成而不是在MyClass析構函數中。 看起來condition_variable可以用來喚醒一個睡眠的主線程並完成這個,但我不想阻止主線程,除了(希望)簡單地用join()。
兩個問題:
如果一個線程的執行函數從未與主線程連接,則執行函數已經退出資源,或者是執行函數退出時釋放的線程和所有相關資源(這樣連接()可能是不必要的並立即返回)?
是否可以從主線程調用auxThread上的join()以響應run()退出而不阻塞主線程?
如果一個線程的執行函數從未與主線程連接,那么它就會退出資源
也許。 這取決於您的實施,但通常不是。
是執行函數退出時釋放的線程和所有相關資源
可能,如果沒有,那么OS會盡快。 這也是實現定義的。
是否可以從主線程調用auxThread上的join()以響應run()退出而不阻塞主線程?
是的,但沒有任何意義。 那唯一join
確實是塊,直到正在執行的功能完成。 在run
完成執行后再次調用join
是不必要的,基本上是無操作。
此外,來自線程的“資源”是最小的。 我不希望像你這樣的單個線程分配大量內存。 RAM現在非常便宜,所以你不必擔心,因為你沒有並行執行5M線程,這在傳統計算機上無論如何都沒有意義。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.