取決於你的'正確'的概念。
通常,銷燬仍附加到正在運行的線程的線程對象是個壞主意。 C++ 11的std::thread
將試圖通過致電std::terminate
來獎勵您。 TBB是一個更寬容(線程只是detached upon destruction),但這並沒有讓潛在的問題消失。
尤其是,您可能會失去保證徹底關機的最後機會。如果您的進程退出,您如何保證分離的線程不在寫入磁盤的過程中?你怎麼能保證它不能堅持一些永久性句柄,如果線程死亡而沒有明確地清理它們,這些句柄將會泄漏?請注意,如果由於父進程死亡導致線程死亡,RAII可能無法啓動。一般來說,除了最瑣碎的線程之外,分離線程對於所有線程都是非常有問題的。
所以可以說是一個「點對點」的方式來關機是:
if(m_tbbTimerThread != NULL)
{
if(m_tbbTimerThread->joinable()) {
<notify the thread to shutdown>
m_tbbTimerThread->join();
}
delete m_tbbTimerThread;
}
對於非阻塞線程,單個原子標誌可能已經足以實現關閉通知。
與每個規則一樣,有一個例外:有時您可以將監視職責轉移到另一個對象,在這種情況下,拆分線程可能會很好。例如,C++ 11 std::async
調用會生成一個新線程,並返回一個線程完成後即將準備就緒的未來。等待未來與加入線程的目的相同,因此不需要返回顯式線程對象。
以後,你的意思是,在不同的功能? –
是的。我編輯了問題以反映這一點。謝謝 – venkysmarty
你有沒有理由認爲這不是正確的方法? (你需要注意的是,如果線程仍在運行,即使刪除了對象,線程也將繼續運行......是你所關心的嗎?) – jogojapan