中断点和清洁退出

时间:2011-10-31 16:24:00

标签: c++ multithreading boost c++11 boost-thread

请参阅以下代码:

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()interruption point吗?
  5. 中断点只是产生线程吗?
  6. thread_group死亡时会发生什么;我是否甚至需要join_all()如果它后面的线程组正好死了?

1 个答案:

答案 0 :(得分:1)

  1. 不,您也可以异常终止线程。中断异常是一种干净的方式。
  2. 问题interrupt_all()先呼叫。
  3. 是的,无法恢复。
  4. 我不明白你的问题。中断点是“我被中断了吗?”的一个点。检查标志,如果是,则抛出异常。 interrupt()调用在一个线程上设置了这个标志,另外,如果那是当前正在做的事情,那么线程就会停止等待。
  5. 据我了解,线程仍然存在,即它们不会以某种方式被迫死亡。您需要确保线程确实退出(这本身取决于您的线程执行的代码),然后join_all()然后才销毁线程组对象。