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