2013-07-25 32 views
0
tbb::tbb_thread*     m_tbbTimerThread; 
m_tbbTimerThread = new tbb::tbb_thread(&sFirstTimerBlocked, this); 

//上面的線程被產生。在C++中刪除一個tbb線程

後來我想刪除不同函數中的線程。我正在做如下。

if(m_tbbTimerThread != NULL) 
{ 
    delete m_tbbTimerThread; 
} 

m_tbbTimerThread = NULL; 

這是正確的做法。

謝謝!

+0

以後,你的意思是,在不同的功能? –

+0

是的。我編輯了問題以反映這一點。謝謝 – venkysmarty

+0

你有沒有理由認爲這不是正確的方法? (你需要注意的是,如果線程仍在運行,即使刪除了對象,線程也將繼續運行......是你所關心的嗎?) – jogojapan

回答

2

取決於你的'正確'的概念。

通常,銷燬仍附加到正在運行的線程的線程對象是個壞主意。 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調用會生成一個新線程,並返回一個線程完成後即將準備就緒的未來。等待未來與加入線程的目的相同,因此不需要返回顯式線程對象。