簡體   English   中英

如何安全地刪除析構函數中的線程指針?

[英]How to safely delete a thread pointer in a destructor?

說,我有一個C ++類,包括一個線程指針作為成員變量。 線程一直運行,直到程序退出。 如果我刪除了析構函數中的指針,那么該時刻線程似乎尚未完成? 管理這個或任何技巧的最佳做法是什么?

示例代碼:

class Car {
public:
    Car();
    ~Car();
private:
    boost::thread *m_runningThreadPtr;
};


Car::Car() {
    m_runningThreadPtr = new boost::thread();
}

Car::~Car() {
    delete m_runningThreadPtr;    // The thread should be still running now. 
                                  // Problematic if it was deleted here?
}

默認情況下,析構函數將調用terminate()來殺死線程,如果它仍然在運行,這是否安全取決於線程當時正在做什么。 如果要等待線程完成,可以在刪除之前調用join() ,並使用某種同步系統(甚至只是一個全局標志)來告訴線程退出。

這取決於你正在尋找什么樣的行為。

如果要刪除該對象,並讓它停止其擁有的線程然后刪除其線程對象,那么您應該有一個停止標志,您的線程會不時檢查。 在析構函數中,您將設置stop標志,然后在您的線程上調用join() 一旦它返回,您可以安全地刪除指針。

另一方面,如果你想要刪除對象並讓線程自行完成直到完成,那么你需要一個更聰明的機制,比如在線程函數的末尾,發布到你的應用程序的主線程一個在你的線程上調用join()然后delete它的回調。 當然,為此,您需要在線程函數中包含指向線程對象的指針。

編輯boost::thread的情況下,它只是在析構函數中分離,因此對於第二個選項,您可以在完成后安全地刪除它。 但是,重要的是要注意,這不適用於std::thread的析構函數,它會在這種情況下終止你的程序。 但是你也可以手動調用detach()然后delete 所以你真的要看看你正在使用的API。

不要刪除它。 完成后讓線程自行刪除。

當沒有更多代碼可以運行時,您的程序就完成了。 你的線程仍在運行代碼嗎? 那為什么你認為你的程序已經完成了?

所以,假設你的線程是我完成的,這是合理的。 這意味着您可以在線程上調用.join() ,之后可以調用delete

暫無
暫無

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

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