2016-02-28 70 views
0

我想要两个线程(让我们称它们为t1和t2)来等待另一个线程t0。让我们简化问题,并说t1和t2都是工作线程。我不认为下面的代码会正常工作。两个STL线程在可连接的第三个线程上等待?

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

这是可能的T1和T2为joinable获得真正的,然后取其join首胜,另一种可能出现segfaults —吧?那么正确的方法有两个线程在单个第三个线程上等待?

有没有办法做到这一点正好与STL的连接,或不T0需要设置某种(原子)完成标志或使用条件变量?

+0

通过STL你是指'std'库? [STL](https://en.wikipedia.org/wiki/Standard_Template_Library)没有线程支持 – Yakk

+0

他们可以自动选择一个线程加入第三个线程,并且选定线程在完成加入后通知另一个线程。 –

回答

0

的* nix的方式是有其子终止父等待。

T0将有信号,它的完成做什么,他们正在等待。就像你说的那样,条件变量是一种简单的方法,或者只是一个标志是最简单的,但t1和t2必须轮询它。

如果你希望他们接着睡,等你不得不使用条件变量。

+0

这更像是一个老兄弟-t1,t2可以和t0并行做很多工作,但是在某个时刻他们需要完成才能完成。我可以用CV来重写,但它确实增加了一些交叉对象的复杂性。 –

+0

那么,为什么不使用一个简单的标志?你可以使它成为原子的,或者在这种情况下volatile会是相同的。 – BitWhistler

+0

与原子标记方法 –

2

使用std::asyncfutureshared_future

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

最后,两个线程可以等待上shared_future。如果有数据包,两者都会得到它的副本。