ブロック条件とブロック解除条件
Boost.Asio の io_service の場合: :run() メソッドが呼び出されると、通常は次の条件のいずれかが満たされるまでブロックされます:
「ディスパッチされるハンドラーがなくなると run() がブロックされることに注意してください」 " io_service による。ハンドラーは、対応する非同期操作が完了したときに呼び出されるコールバック関数またはハンドラー オブジェクトを指します。スケジュールされた作業とハンドラーがすべて実行されると、io_service は保留中の操作がなくアイドル状態であると見なされ、run() のブロックが解除されます。
例 1: 同期 TCP/IP クライアント
ご質問で提供されたコード例では、run() メソッドは非同期読み取り操作が完了するのを待機するためブロックされます。ソケットはサーバーからデータを受信するように設定されており、データが受信されて handle_async_receive ハンドラーによって処理されるまで、run() メソッドはブロックされたままになります。
例 2: ワーカー スレッド プール
2 番目の例では、run() がワーカー スレッド内で呼び出されます。作業オブジェクトは、スケジュールされたハンドラーがない場合でも io_service がアクティブなままであることを保証します。 CalculateFib ハンドラーが io_service にポストされると、ワーカー スレッドによって実行されます。 3 つのフィボナッチ計算がすべて完了すると、作業オブジェクトは破棄され、io_service が新しい作業の受け入れを停止します。これにより、実行するタスクがもうないことがワーカー スレッドに通知され、ワーカー スレッドが終了できるようになります。その結果、run() のブロックが解除され、メインスレッドが続行できるようになります。
例 1 と 2 の違い
どちらの例も非同期操作を使用しますが、最初の例は事実上同期的に動作します。データが受信されるまでブロックされるためです。 2 番目の例では、ワーカー スレッドが並行して実行され、io_service がさらなる作業を待機している間に他のタスクを処理できるようになります。
非同期操作と同期操作
一般コードが複雑になる可能性があるため、同期操作と非同期操作を混合しないことをお勧めします。非同期プログラミングの利点は次のとおりです。
以上がBoost.Asio の io_service::run() メソッドはいつブロック解除されますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。