簡體   English   中英

在C ++中刪除tbb線程

[英]deleting a tbb thread in C++

tbb::tbb_thread*                    m_tbbTimerThread;
m_tbbTimerThread = new tbb::tbb_thread(&sFirstTimerBlocked, this);

//產生上面的線程。

后來我想刪除不同功能的線程。 我這樣做如下。

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

m_tbbTimerThread = NULL;

這是正確的做法。

謝謝!

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

一般來說,銷毀仍然附加到正在運行的線程的線程對象是一個壞主意。 C ++ 11的std::thread將通過調用std::terminate來獎勵你嘗試這個。 TBB更寬容(線程在破壞時只是分離 ),但這並沒有使根本問題消失。

特別是,您可能會失去保證干凈關閉的最后機會。 如果您的進程退出,您如何保證分離的線程不在向磁盤寫入內容? 如果線程在沒有明確清除它的情況下死掉,你怎么能保證它不會保留一些會泄漏的持久句柄? 請注意,如果線程因父進程死亡而被殺死,RAII可能不會啟動。 一般來說,除了最瑣碎的線程之外,分離線程是非常有問題的。

所以可以說是一種“更加嚴厲”的關閉方式是:

if(m_tbbTimerThread != NULL ) 
{
    if(m_tbbTimerThread->joinable()) {
        <notify the thread to shutdown>
        m_tbbTimerThread->join();
    }
    delete m_tbbTimerThread;
}

對於非阻塞線程,單個原子標志可能已足以實現關閉通知。

與每條規則一樣,有一個例外:有時您可以將監視職責轉移到另一個對象,在這種情況下,分離線程可能沒問題。 例如,C ++ 11 std::async調用生成一個新線程,並返回一個線程完成后將准備就緒的未來。 等待將來與加入線程的目的相同,因此不需要async來返回顯式線程對象。

暫無
暫無

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

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