実装方法タイムを待つブロッキング電話のかけ方は?
-
26-09-2019 - |
質問
い状況にあります。私のC++ライブラリは一部のプロセス間通信、 wait()
機能ブロックを待機は、着信メッセージ。は困難であることが必要 timed お待ち、さらには、状態値がない場合のメッセージの受信を設定します。
最もエレガントな解決方法だろうに書き換えの図書館を追加する時間を待ち、そのAPIのためにもこの質問に思いなが可能になる。(実際には、これらを難しくしていきたいなと思っていますか、その他のオプションです。)
そんな忙しいお待ちループでは、擬似コード:
while(message == false && current_time - start_time < timeout)
{
if (Listener.new_message()) then message = true;
}
たくない忙しいのでお待ち頂く食べてプロセッサーサイクルしました。かもいだけで追加 sleep()
お電話のループを避けるプロセッサの負荷としてその手段と遅くなります。いうことの適切なブロックおよび割り込みを行う.場合によるネジ切るようにして boost::thread
, なのでいりませんので、予めごす。
私の投稿この質問でこのような状況の考えを明確にし、"ベストプラクティス"、なかんに共通パターンです。何をしていきますか?
編集追加: 大部分の心配はここにあるスポットのプログラムの両方の性能を重視し、重要な条件やメモリ解放されます。このような"利用のスレッドおよびタイマー"はアドバイスが含まれており、今後とも残そうとしていることをどのように実施することを安全で正しい方向で、簡単に見出すことができ自作のピンミスのコード私は全く身に覚えがないのですかたとうとしています。このように、実際のコード例は、もうお願いいたします。
これにより、今まで以上に懸念されるものの、複数のスレッド溶液を用いて、ブロックを呼ぶ第二のスレッドにいる時間-待機するスレッドの方法はどうなることを第二のスレッドの場合、ブロックと呼んでいきます。知っているのがタイムでお待ち最初のスレッドを返しやんごとな応答が起こったかとなものではありません"とんとことって~えいとくいその"漏洩"スレッドが周辺にはブロック状態のか?必要があります。を回避す。(必要があります。を避けることが漏洩しないように、第二のスレッドのメモリ?) な完成されたソリューションしていたんですが、その必要がなければ漏れのブロックの通話になります。
解決
あなたは、両方のPOSIXである、sigaction(2)
とalarm(2)
を使用することができます。あなたは、はsigactionを使用して、タイムアウトのコールバックアクションを設定し、その後、あなたは、アラームを使用して、タイマーを設定し、その後、あなたのブロッキング呼び出しを行います。それはあなたの選択したタイムアウト時間内に完了しない場合は、ブロッキング呼び出しが中断されます(数秒で、あなたはより細かい粒度が必要な場合はsetitimer(2)
を使用することができます)。
注意
このページでは、便利かつかなり簡潔です。 http://www.gnu.org/s/libc /manual/html_node/Setting-an-Alarm.htmlする
他のヒント
何がしたいことに応じて、選択(2)のようなものですOSあなたがターゲットとしている。
これが鳴ります。 A condition_variable
をカプセル化別のスレッドで着信拒否。 (前に述べたような)条件変数によって守られ、そのスレッド内の中間メッセージ・バッファを有しています。その条件変数であなたのメインスレッド時限待機してください。条件が満たされた場合には中間格納されたメッセージを受信します。
そこで、基本的APIとアプリケーションの間の時限待機できる新しいレイヤーを入れました。アダプタパターンます。
に関する
うる次のスレッドの場合、ブロックと呼んでいきます。
を行っており、現在はゆっくりと なし い回復 綺麗に な協力という機能(図書館)'綺麗にいるとの清掃すべての資源の所有するスレッドを含むメモリー、その他のスレッド、ロック、ファイル、ロックファイル、ソケット、GPU資源... 国連-きることができます。キの暴走ます。