请考虑以下事项:
#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
之下,但不知何时感觉不是正确的方式。)
我看到一个可能存在问题的案例:
wait
wait
并唤醒其他线程(但wait
函数未完成其工作)wait
唤醒并破坏障碍wait
中执行其他一些事情(例如,寻找完成函数),因为它们对已删除的屏障对象进行操作而崩溃。所以问题很可能归结为wait
是否可以被处理&#34;原子地&#34; (即,线程被唤醒后它不会触及屏障) - 除非我错过了其他一些风险?
当第count个线程调用wait时,屏障被重置,所有等待的线程都被解除阻塞。
我说这句话表明屏障首先被触及,只有在线程被解除之后 - 或者它只是一个不可靠的过度解释?