Boost.Asio の io_service::run メソッドがブロックまたはブロック解除されるとき
io_service::run メソッドの説明
io_service::run() は、イベント ループを実行し、受信および送信ネットワーク イベントを処理します。特定の条件が満たされるまでブロックされます:
-
ディスパッチするハンドラーがありません: 実行を待っている保留中のハンドラー (コールバック) がなくなったとき。
-
io_service Stopped: io_service::stop() によって io_service オブジェクトが明示的に停止されたとき。
実行およびハンドラーのディスパッチ
ハンドラーは、 io_service を使用して、非同期操作を実行したり、イベントを処理したりできます。 async_ 関数を使用して開始される非同期操作は、io_service の作業を作成します。
イベントのブロックおよびブロック解除
イベントのブロック:
io_service::run( ) 実行すべき作業またはディスパッチすべきハンドラーがある場合にブロックします。例:
- 非同期読み取りまたは書き込み操作が開始されます。
- ハンドラーが io_service に追加され、実行を待機しています。
ブロック解除イベント:
io_service::run() は、次の条件がすべて満たされるとブロックを解除します:
- すべての作業が終了し、保留中のハンドラーがなくなりました (例 1: 非同期ネットワーク I/O のブロック
- socket.async_receive の場合() が呼び出されると、ソケットからデータを読み取るための作業が io_service に追加されます。 io_service::run() は、データが受信されるかエラーが発生するまでブロックし、handle_async_receive コールバックが呼び出されるのを待ちます。
例 2: io_service::work を使用した ThreadPool
例内3a、io_service::work が使用されます。このオブジェクトは、io_service が作業不足になるのを防ぎ、io_service::run() を実行しているスレッドが確実に実行を継続できるようにします。作業オブジェクトが破棄されると、io_service の作業がなくなり、io_service::run() がブロックを解除します。
同期操作と非同期操作の混合を避ける
一般に、同期操作と非同期操作の混合を避けることをお勧めします。 。これにより、コードがより複雑になり、理解しにくくなる可能性があります。 Boost.Asio の async_ 関数を使用して、同期操作を非同期操作に変換できます。
以上がBoost.Asio の io_service::run() メソッドがブロックまたはブロック解除されるのはどのような場合ですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。