两个 STL 线程在第三个线程上等待 — 使用 joinable



我希望两个线程(我们称它们为 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::asyncfutureshared_future

std::thread替换为std::async调用,可能返回void(或线程将产生的任何内容,理想情况下)。 然后把生产的future,移到shared_future里。

最后,两个线程都可以等待该shared_future。 如果有数据包,双方都将获得它的副本。

*nix 方法是让父级等待其子级终止。

t0 必须发出信号,它已经完成了他们正在等待的任何事情。就像你说的,条件变量是一种简单的方法,或者只是一个标志是最简单的,但 t1 和 t2 必须轮询它。

如果你想让他们休眠等待,那么你就必须使用条件变量。

最新更新