簡體   English   中英

C ++ 11:如何在執行函數退出后立即加入std :: thread?

[英]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()。

兩個問題:

  1. 如果一個線程的執行函數從未與主線程連接,則執行函數已經退出資源,或者是執行函數退出時釋放的線程和所有相關資源(這樣連接()可能是不必要的並立即返回)?

  2. 是否可以從主線程調用auxThread上的join()以響應run()退出而不阻塞主線程?

如果一個線程的執行函數從未與主線程連接,那么它就會退出資源

也許。 這取決於您的實施,但通常不是。

是執行函數退出時釋放的線程和所有相關資源

可能,如果沒有,那么OS會盡快。 這也是實現定義的。

是否可以從主線程調用auxThread上的join()以響應run()退出而不阻塞主線程?

是的,但沒有任何意義。 那唯一join確實是塊,直到正在執行的功能完成。 run完成執行后再次調用join是不必要的,基本上是無操作。

此外,來自線程的“資源”是最小的。 我不希望像你這樣的單個線程分配大量內存。 RAM現在非常便宜,所以你不必擔心,因為你沒有並行執行5M線程,這在傳統計算機上無論如何都沒有意義。

暫無
暫無

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

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