tbb::tbb_thread* m_tbbTimerThread;
m_tbbTimerThread = new tbb::tbb_thread(&sFirstTimerBlocked, this);
//产生上面的线程。
后来我想在不同的功能中删除线程。我是这样做的。
if(m_tbbTimerThread != NULL )
{
delete m_tbbTimerThread;
}
m_tbbTimerThread = NULL;
这是正确的做法。
谢谢!
答案 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
不需要返回显式线程对象。