我希望两个线程(我们称它们为 t1 和 t2)等待另一个线程 t0。让我们简化一下,假设 t1 和 t2 都是工作线程。我认为以下代码无法正常工作。
/* ... code both t1 and t2 run ... */
if (t0.joinable()) {
/* race condition here */
t0.join();
}
t1 和 t2 都可能为 joinable
个,然后哪个join
第一个获胜,另一个可能出现段错误——对吧?那么让两个线程在第三个线程上等待的正确方法是什么?
有没有办法只通过 STL 的连接来做到这一点,或者 t0 是否需要设置某种(原子)完成标志或使用条件变量?
使用 std::async
和 future
和 shared_future
。
将std::thread
替换为std::async
调用,可能返回void
(或线程将产生的任何内容,理想情况下)。 然后把生产的future
,移到shared_future
里。
最后,两个线程都可以等待该shared_future
。 如果有数据包,双方都将获得它的副本。
*nix 方法是让父级等待其子级终止。
t0 必须发出信号,它已经完成了他们正在等待的任何事情。就像你说的,条件变量是一种简单的方法,或者只是一个标志是最简单的,但 t1 和 t2 必须轮询它。
如果你想让他们休眠等待,那么你就必须使用条件变量。