2

タスクAが完了オブジェクトで実行する前に(タスクBcomplete_all()から)完了オブジェクトでが呼び出された場合はどうなりますか?待機時にオブジェクトがすでに完了していてすぐに戻るかどうかを確認するためのAPIはありますか?1つの方法は、メッセージを送信する前にロックされ、待機する前にロック解除されるを使用することです。そのロックは前に取得し、後で解放する必要がありますが、よりクリーンでより良い方法があるかどうか疑問に思っています。どんなアイデアでも大歓迎です。wait_for_completion()mutexcomplete_all()

詳細コンテキスト: タスクAは完了オブジェクトを初期化し、完了オブジェクトのアドレスとともにタスクBに要求を送信してから、完了を待ちます。タスクBは、メッセージを取得したときに何らかの処理を実行してcomplete_all()から、完了オブジェクトに対して実行します。

4

1 に答える 1

2

特定の完了オブジェクトに対してcomplete()またはcomplete_all()が前に呼び出された場合、はすぐに戻ります。完了オブジェクトは、おおよそセマフォに似ています。wait_for_completion()wait_for_completion()

  • 内部的には、完了オブジェクトにはdone0に初期化されるカウンターがあります。

  • wait_for_completion()までスリープし(または、がすでに0より大きいdone > 0場合はすぐに続行し)、戻る前にアトミックにデクリメントします。donedone

  • complete()doneでスリープしている最初のプロセスをインクリメントしてウェイクアップしwait_for_completion()ます。

  • complete_all()(事実上無限大)に設定doneUINT_MAX / 2、で眠っているすべての人を起こしwait_for_completion()ます。

したがって、あなたの質問を正しく理解していれば、追加でロックする必要はありません。完了オブジェクトの内部wait.lockスピンロックはすでにカウンターアクセスを同期しているため、心配しているケースは正しく処理されます。

于 2013-03-26T17:40:48.157 に答える