Rebol 3のすべてのポート操作は非同期です。同期通信を行うために見つけることができる唯一の方法は、を呼び出すことwait
です。
ただし、この場合の待機の呼び出しの問題は、すべての開いているポートのイベントをチェックすることです(待機に渡されるポートブロックにない場合でも)。次に、応答するイベントハンドラーを呼び出しますが、これらのイベントハンドラーの1つで読み取り/書き込みを実行できます。その結果、「待機」の再帰呼び出しが発生する可能性があります。
どうすればこれを回避できますか?
Rebol 3のすべてのポート操作は非同期です。同期通信を行うために見つけることができる唯一の方法は、を呼び出すことwait
です。
ただし、この場合の待機の呼び出しの問題は、すべての開いているポートのイベントをチェックすることです(待機に渡されるポートブロックにない場合でも)。次に、応答するイベントハンドラーを呼び出しますが、これらのイベントハンドラーの1つで読み取り/書き込みを実行できます。その結果、「待機」の再帰呼び出しが発生する可能性があります。
どうすればこれを回避できますか?
回答:
私は2つの設計上の問題があると思います(おそらく手元のツール/ソリューションに固有の問題)。
Wait
やりすぎです- it will check events for all open ports
。健全な環境では、待機は必要な場合にのみ実装する必要があります。デバイスごと、ポートごと、ソケットごと...共有リソース間の不要な相互依存関係を作成することは、特に共有リソースを知っている(相互依存関係がなくても)とうまくいきません。多くの問題を引き起こす可能性があります。
イベントハンドラーが多すぎる可能性があります。イベントハンドラはできるだけ短くし、イベントのみを処理する必要があります。それ以上の場合は、ハンドラーの処理が多すぎます(特に、他の共有リソースが関係している場合)。多くの場合、ハンドラーはデータを保存するだけです。そうしないと、失われます。非同期ジョブはより複雑なことを行います。
鍵はそのまま使えます。Cummunication1は、グローバルロック状態、つまり変数を設定できます(スレッドセーフであることを確認してください)。locked = true
。その後、Communication2はロックが解除されるまで待機できます。
loop do
sleep 10ms
break if not locked
end
locked = true
handle_communication()