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 を待ち始める前に親が condvar を実行すると、デッドロックが発生します。その場合、親はnotify子が終了するのを待ち、子は condvar のシグナルを待ちます。条件変数。

だから、私の質問は、子が常にwait最初に、つまり親が実行される前に実行されるようにする方法notifyです。それとも、問題全体について完全に間違っていますか?

前もって感謝します。

4

2 に答える 2

2

はい、あなたは間違った方法で問題に取り組んでいます。というか、condvars を想定されていない方法で使用しています。Condvar は、条件である「何か」が変化したことを他のスレッドに通知する手段です。スレッドを終了できるのはその状態です。

condvar を使用するには、 conditionmutex、およびcondvar自体の 3 つの要素が必要です。通知スレッドが行うよりも:

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

そして待機中のスレッドは次のことを行います:

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

.lock()(ミューテックスをロックするために RAII を使用するので、.unlock()直接メソッドを呼び出すことが良い考えであるという認識を広めません)

while重要であることに注意してください。wait通知されていなくても誤って起動する場合があります。

于 2012-08-07T06:45:58.723 に答える
1

セマフォまたはイベントという名前のインタープロセスを使用します。状態を保持するものです。これにより、子が待機する前に親がシグナルを送信しても、シグナルは受信されます。

于 2012-08-07T06:57:35.370 に答える