请看下面的代码:
boost::thread_group threads;
boost::barrier barrier(10);
thing pThing;
for( size_t i = 0; i < 10; ++i )
{
threads.create_thread(
[&barrier, &pThing]()
{
while( true )
{
// do some stuff with pThing
if( barrier.wait() ) // let all threads catch up before resettings, and only 1 thread resets
pThing.Reset();
barrier.wait(); // let all threads wait until the reset is completed
}
});
}
threads.join_all();
问题:
- 我是否需要一种方法来中断 while(true) 以使线程正确退出?
- 由于所有线程都在无限循环,
join_all()
是否会完成? - 当一个线程完成它的工作时会发生什么,它会死吗?
barrier.wait()
是 interruption point 吗? ?- 中断点是否只让出线程?
- thread_group 死亡时会发生什么;如果线程组无论如何都会立即死亡,我什至需要
join_all()
吗?
最佳答案
- 不,您也可以异常终止线程。中断异常是一种干净的方法。
- 首先发出
interrupt_all()
调用。 - 是的,无法恢复。
- 是的。
- 我不明白你的问题。中断点是“我被中断了吗?”的点。检查标志,如果为真,则抛出异常。
interrupt()
调用在线程上设置此标志,此外,如果线程正在等待,则停止等待。 - 据我所知,线程继续存在,即它们不会以某种方式被迫死亡。您需要确保线程确实退出(这本质上取决于您的线程执行的代码),然后
join_all()
然后才销毁线程组对象。
关于c++ - 中断点和清理退出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7956528/