【问题标题】:Two STL threads wait on a third thread—do with joinable?两个 STL 线程在第三个线程上等待——用 joinable 做吗?
【发布时间】:2016-02-28 20:50:51
【问题描述】:

我想要两个线程(我们称它们为 t1 和 t2)等待另一个线程 t0。让我们简化一下,说 t1 和 t2 都是工作线程。我认为下面的代码不能正常工作。

/* ... code both t1 and t2 run ... */
if (t0.joinable()) { 
  /* race condition here */
  t0.join();
}

对于joinable,t1 和 t2 都可能为真,然后 joins 中的第一个获胜而另一个可能出现段错误,对吗?那么让两个线程在一个第三个线程上等待的正确方法是什么?

有没有办法仅通过 STL 的连接来做到这一点,或者 t0 是否需要设置某种(原子)完成标志或使用条件变量?

【问题讨论】:

  • STL 是指std 库? STL 没有线程支持
  • 他们可以原子地选择一个线程加入第三个线程,一旦完成加入,所选线程会通知另一个线程。

标签: multithreading c++11 stl thread-safety


【解决方案1】:

使用std::asyncfutureshared_future

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

最后,两个线程都可以等待shared_future。如果有数据包,双方都会得到一份副本。

【讨论】:

    【解决方案2】:

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

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

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

    【讨论】:

    • 它更像是一个兄长——t1 和 t2 可以与 t0 并行地做很多工作,但在某个时刻他们需要 t0 才能完成。我可以用 CV 重写它,但它确实增加了一些跨对象的复杂性。
    • 那么,为什么不使用一个简单的标志呢?你可以让它成为原子的,或者 volatile 在这种情况下是一样的。
    • 采用原子标志方法
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-02-15
    • 1970-01-01
    • 2020-02-26
    • 1970-01-01
    • 2015-08-23
    • 1970-01-01
    • 2020-10-04
    相关资源
    最近更新 更多