在C ++中删除tbb线程

时间:2013-07-25 06:44:23

标签: c++ tbb

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

//产生上面的线程。

后来我想在不同的功能中删除线程。我是这样做的。

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

m_tbbTimerThread = NULL;

这是正确的做法。

谢谢!

1 个答案:

答案 0 :(得分: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调用产生一个新线程,并返回一个线程完成后将准备就绪的未来。等待未来与加入线程的目的相同,因此async不需要返回显式线程对象。