我有一个父进程,它会生成一定数量的子进程。这些子进程执行一些工作,并通过进程间消息队列向父进程发送带有结果的消息。但是,我还希望子进程等待父进程向它们发送消息已被正确接收和处理的确认,并且仅在从父进程接收到这样的信号后终止。
现在,代码看起来或多或少像这样:
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
之前?或者我完全错误地解决了整个问题?
提前谢谢。
答案 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)
使用一个名为信号量或事件的进程间 - 保持状态的东西,这样即使在孩子等待之前父信号,仍然会收到信号。