boost :: barrier对象的生命周期 - 它应该在所有线程到达wait()后保持活动吗?

时间:2016-10-19 17:20:59

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

请考虑以下事项:

#include <boost/thread.hpp>

boost::thread spawn() {
    boost::barrier barrier{2};
    boost::thread ret{[&barrier] {
        // some initialization code  
        barrier.wait();
        // actual thread code
    }};

    barrier.wait();
    return ret;
}

spawn函数在堆栈上创建一个boost::barrier对象,生成一个新线程,然后等待它到达屏障。目的是spawn函数想要等到生成的线程实际启动并初始化之后再返回控件。

新线程到达屏障后,spawn函数恢复,销毁屏障对象并返回。看起来很整洁。

提出的方法是否安全?如果没有,推荐的方法是什么? (我想我可以将障碍保持在shared_ptr之下,但不知何时感觉不是正确的方式。)

我看到一个可能存在问题的案例:

  1. 主要线程调用wait
  2. 产生线程调用wait并唤醒其他线程(但wait函数未完成其工作)
  3. 父线程从wait唤醒并破坏障碍
  4. 衍生线程在wait中执行其他一些事情(例如,寻找完成函数),因为它们对已删除的屏障对象进行操作而崩溃。
  5. 所以问题很可能归结为wait是否可以被处理&#34;原子地&#34; (即,线程被唤醒后它不会触及屏障) - 除非我错过了其他一些风险?

    Boost documentation说:

      

    当第count个线程调用wait时,屏障被重置,所有等待的线程都被解除阻塞。

    我说这句话表明屏障首先被触及,只有在线程被解除之后 - 或者它只是一个不可靠的过度解释?

0 个答案:

没有答案
相关问题