【发布时间】:2016-02-10 05:25:55
【问题描述】:
如果多个线程尝试加入同一个线程,pthreads 的行为未定义:
如果多个线程同时尝试加入同一个线程, 结果未定义。
boost::threads 也一样吗?文档似乎没有指定这一点。
如果未定义,那么多个线程等待一个线程完成的干净方式是什么?
【问题讨论】:
-
嗯,有趣的是,我可以阅读的 N4296 C++ 标准草案中没有提到它。我会说那是UB和/或“不要这样做”的行为。 :)
-
其他线程可以测试一个线程是否为
joinable(),或者关闭线程可以使用condition_variable来表示它的所有工作已经完成(即使它可能仍然运行) -
@wilx,
std::thread::join()是一个非常量函数,因此同时调用它是一个数据竞争,即未定义的行为。除非另有说明,否则该规则适用于所有标准库类型。 -
@Tas,如果两个线程同时调用
joinable()是什么阻止它们然后尝试调用join()?即使只有一个调用join(),但没有某种同步,join()调用与另一个线程中的joinable()调用冲突,导致数据竞争,即未定义的行为。
标签: c++ multithreading boost