c++ - 中断点和清理退出

标签 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. 不,您也可以异常终止线程。中断异常是一种干净的方法。
  2. 首先发出 interrupt_all() 调用。
  3. 是的,无法恢复。
  4. 是的。
  5. 我不明白你的问题。中断点是“我被中断了吗?”的点。检查标志,如果为真,则抛出异常。 interrupt() 调用在线程上设置此标志,此外,如果线程正在等待,则停止等待。
  6. 据我所知,线程继续存在,即它们不会以某种方式被迫死亡。您需要确保线程确实退出(这本质上取决于您的线程执行的代码),然后 join_all() 然后才销毁线程组对象。

关于c++ - 中断点和清理退出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7956528/

相关文章:

c# - 保证TransformBlock输出顺序

c++ - 如何从 boost::thread 取回值?

WinForms多线程数据绑定(bind)场景,最佳实践?

c++ - LPTHREAD_START_ROUTINE/类数组

c++ - 如果抽象基类是一个接口(interface),是否必须在派生类构造函数中调用基类构造函数?

c++ - 对象反射

c++ - 为什么传递位置参数时总是得到默认值?

c++ - 地下结构化绑定(bind)实现和 std::tuple

C++ - 绑定(bind)函数

boost 多边形序列化