というわけで、こんな状況です。wait()
受信メッセージをブロックして待機する関数を使用して、プロセス間通信を行う C++ ライブラリがあります。問題は、指定された時間内にメッセージが受信されない場合にステータス値を返す、時間指定の待機が必要なことです。
最も洗練された解決策は、おそらくライブラリを書き直して、その API に時限待機を追加することですが、この質問のために、それは実現可能ではないと仮定します。(実際には難しそうなので、他にどんな選択肢があるのか知りたいです。)
疑似コードでビジー待機ループを使用してこれを行う方法は次のとおりです。
while(message == false && current_time - start_time < timeout)
{
if (Listener.new_message()) then message = true;
}
ただし、プロセッサ サイクルを消費するビジーな待機は望ましくありません。また、プロセッサの負荷を回避するためにループに呼び出しを追加したくありませんsleep()
。これは、応答が遅くなることを意味します。適切な種類のブロックと割り込みでこれを行うものが必要です。より良い解決策にスレッド化が含まれる場合 (可能性が高いと思われます)、既に を使用しているboost::thread
ので、それを使用することをお勧めします。
これはかなり一般的なパターンであるため、明確な「ベストプラクティス」の正しい答えがあるような状況のように思われるため、この質問を投稿しています。それを行う正しい方法は何ですか?
追加する編集:ここでの私の懸念の大部分は、これがプログラム内のパフォーマンスが重要であり、競合状態やメモリリークを回避するために重要な場所にあるということです。したがって、「2 つのスレッドと 1 つのタイマーを使用する」というアドバイスは役に立ちますが、実際にそれを安全かつ正しい方法で実装する方法を見つけようとしているところが残っています。作ったことすら知りません。したがって、いくつかの実際のサンプルコードは本当にありがたいです!
また、マルチスレッド ソリューションについて懸念があります。 ? 最初のスレッドの時限待機が返されることはわかっており、応答が発生せず、処理が続行されることがわかりますが、その後、ブロックされた状態で永遠に座っているスレッドを「リーク」しましたか? それを回避する方法はありますか?(それを回避し、2 番目のスレッドのメモリのリークを回避する方法はありますか?) ブロッキング呼び出しが返されない場合にリークを回避するために必要なものに対する完全な解決策が必要です。