如何强制执行两个进程的顺序?

时间:2012-08-07 06:21:05

标签: c++ multithreading boost deadlock

我有一个父进程,它会生成一定数量的子进程。这些子进程执行一些工作,并通过进程间消息队列向父进程发送带有结果的消息。但是,我还希望子进程等待父进程向它们发送消息已被正确接收和处理的确认,并且仅在从父进程接收到这样的信号后终止。

现在,代码看起来或多或少像这样:

parent                      child
spawn process
wait for message            do processing
                            send message
receive message             wait on condvar
save the message
notify the condvar          resume execution
wait for child termination  terminate

当然,如果父母在孩子甚至开始等待之前在condvar上执行notify,那么会导致死锁 - 如果发生这种情况,那么父母会等待孩子退出,孩子在条件变量上等待信号。

所以,我的问题是:如何确保孩子始终首先执行wait,即父母执行notify之前?或者我完全错误地解决了整个问题?

提前谢谢。

2 个答案:

答案 0 :(得分:2)

是的,你正在以错误的方式解决问题。或者更确切地说,使用condvars它们不应该工作的方式。 Condvar是一种通知另一个线程“某事”,条件已经改变的意思。这是允许线程终止的条件。

您需要三个元素才能使用condvar: condition mutex condvar 本身。比通知线程会做:

{
    unique_lock(mutex);
    condition = true;
    condvar.notify();
}

并且等待线程将执行:

{
    unique_lock(mutex);
    while(!condition)
        condvar.wait(mutex);
}

(使用RAII来锁定互斥锁,因此我不会普遍认为直接调用.lock().unlock()方法是个好主意。

请注意,while 重要。即使没有得到通知,wait也可能会虚假地醒来!

答案 1 :(得分:1)

使用一个名为信号量或事件的进程间 - 保持状态的东西,这样即使在孩子等待之前父信号,仍然会收到信号。