簡體   English   中英

C ++ 11中的std :: thread,如何確保線程在析構函數中完成

[英]std::thread in C++11, how to ensure a thread is finished inside a destructor

我想確保在銷毀對象之前完成線程。

這是我能想到的最基本的示例:

struct User {
    std::thread worker_thread;

    ~User() {
        if (worker_thread.joinable()) {
            worker_thread.join();
        }
    }
};

這是解決問題的正確方法嗎?

這是不正確的,因為join()可能會引發異常,並且您不想讓任何異常轉義任何析構函數。 摘自Herb Sutters 拋出析構函數及其為何邪惡中的出色C ++

遵守規范的異常安全規則:切勿讓異常從析構函數或重載的運算符delete()operator delete[]();逸出operator delete[](); 編寫每個析構函數和釋放函數,就好像它們具有“ throw() ”的異常規范一樣。

我也認為評論中提到的方法很好,但是如果需要,您需要確保正確退出線程。

例如,如果您有一個遞減計數的循環計數器,則需要在長時間等待的隊列之前正確關閉。 例如,當您有一個“無盡的”布爾條件必須切換時,等等。

暫無
暫無

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

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