中断点和清洁退出

interruption points and clean exiting

本文关键字:退出 清洁 断点 中断      更新时间:2023-10-16

查看以下代码:

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();

问题:

  1. 我是否需要一种方法来打破while(true)的线程正确退出?
  2. join_all()完成,因为所有的线程是无限循环?
  3. 当一个线程完成它的工作后会发生什么,它死了吗?
  4. barrier.wait()中断点吗?
  5. 中断点只是产生线程吗?
  6. 当thread_group死亡时会发生什么;我甚至需要join_all(),如果线程组,它会死后,无论如何?
  1. 不,你也可以用异常终止一个线程。中断异常是一个干净的方法。
  2. 先发出interrupt_all()呼叫。
  3. 无法恢复。
  4. 是的。
  5. 我不明白你的问题。中断点是"我被打断了吗?"'标志被检查,如果为真,则抛出异常。interrupt()调用在线程上设置此标志,另外,如果线程当前正在执行此操作,则使线程停止等待。
  6. 据我所知,线程继续存在,即它们不会以某种方式被迫死亡。你需要确保线程退出(这本质上取决于你的线程执行什么代码),然后join_all(),然后销毁线程组对象。