1

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

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

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?还是我对整个问题的看法完全错误?

先感谢您。

4

2 回答 2

2

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

使用 condvar 需要三个元素:条件互斥体condvar本身。比通知线程会做:

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

等待线程会做:

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

(使用 RAII 来锁定互斥体,所以我不认为直接调用.lock().unlock()方法是个好主意)

请注意,这while重要wait即使没有通知也可能会虚假唤醒!

于 2012-08-07T06:45:58.723 回答
1

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

于 2012-08-07T06:57:35.370 回答