実行できます。ただし、ToolTalk サービスには負荷分散の概念がないため、ToolTalk はいくつかのハンドラから 1 つだけ選択し、一致するものであれば、その他のメッセージもそのハンドラだけに配信します。メッセージをその他のハンドラにも配信させるには、次のような方法があります。
メッセージを受信してもビジーなのでそのメッセージを処理したくないプロセスは、メッセージを拒否できます。この場合、ToolTalk サービスは使用可能な次のハンドラを探します。(登録されているハンドラがすべて拒否した場合は、処置オプションが適用されます。)
この方法では、tt_fd が有効になったら tt_message_receive を呼び出すというイベントループを、プロセスが実行中でなければなりません。ただし、プロセスが複雑な計算ループを実行していると、この方法ではうまくいきません。
ビジーになるようなメッセージの場合は、そのパターンを登録解除する。次に例を示します。
m = tt_message_receive(); if (m is the message that causes us to go busy) { tt_pattern_unregister(p); } |
ToolTalk サービスは、パターンが登録されていないと、一致するメッセージをプロセスに渡しません。プロセスでもう一度メッセージを受信したい場合は、パターンを再登録してください。
この方法を使用すると、競争条件が生じます。たとえば、tt_message_receive と tt_pattern_unregister 呼び出しの間に次のメッセージが送信され、このプロセスに渡される可能性があります。
方法 1 と方法 2 を組み合わせる。
方法 1 と方法 2 を組み合わせて、次のようにすることもできます。
get the message unregister the pattern loop, calling tt_message_receive until it returns 0; reject all the returned messages handle the message re-register the pattern repeat |
この方法では、プロセスで登録するパターンは 1 つであることが前提です。