マルチスレッド アプリケーションを開発する場合、共有メモリへのアクセスを、たとえばモニターまたはロックを使用して同期する必要があることを理解しています。
質問
ロックされたコード ブロック (proc1) を使用しているプロセスがコードの使用を終了したことを、待機中のプロセス (proc2) にどのように通知しますか?
マルチスレッド アプリケーションを開発する場合、共有メモリへのアクセスを、たとえばモニターまたはロックを使用して同期する必要があることを理解しています。
ロックされたコード ブロック (proc1) を使用しているプロセスがコードの使用を終了したことを、待機中のプロセス (proc2) にどのように通知しますか?
実際のオペレーティングシステムプロセスについて話しているのですか、それともプロセス内のタスクについて話しているだけですか?
プロセス内のタスクだけの場合は、通常、ロックに作業を任せます。2番目のタスクは、最初のタスクが現在所有しているロックを取得しようとし、ブロックするだけです。最初のタスクがロックを解除すると、2番目のタスクのブロックが自動的に解除されます。
2番目のスレッドで他の作業を最初に実行するオプションを使用したい場合は、Monitor.TryEnter
代わりに使用できますが、少し面倒です。
待ちたいが、単にロックするよりも高度な要件がある場合Monitor.Pulse/PulseAll/Wait
は、おそらく必要になります。例については、このページの後半を参照してください。
実際にプロセスについて話している場合は、などのシステム全体の構造を使用する必要がありますMutex
。これらは、インプロセスの.NETモニターよりも「重い」ものですが、プロセス間の調整が可能です。
他のプロセスは通常ブロックされ、ロックを取得するのを待ちます。最初のプロセスがそれをリリースすると、2番目のプロセスがそれを取得できます。
言い換えると、典型的なシナリオでは、他のスレッドに「指示」するのではなく、そのスレッドの実行を阻止するのをやめます。
(通常はAutoResetEventまたはManualResetEventによって処理される、スレッドに移動を指示したいシナリオがあります)
リセットイベントはこれに特に便利です。
http://msdn.microsoft.com/en-us/library/system.threading.manualresetevent.aspx
マルチスレッドの性質によっては、Thread.Join でうまくいく場合があります。スレッドが終了するまで呼び出しスレッドをブロックし、標準のメッセージ ポンピングを実行し続けます。