Boost.Asio の io_service::run() メソッドがブロックまたはブロック解除されると混乱する
はじめに
io_service::run() メソッドは、 Boost.Asio の非同期イベント ループ インフラストラクチャ。ライブラリを効果的に使用するには、いつブロックおよびブロック解除されるかを理解することが重要です。
ブロック/ブロック解除動作
io_service::run() は、保留中のハンドラーがすべて実行されるまでブロックします。または io_service が停止するまで。ハンドラーは、Boost.Asio を介して開始される特定の非同期操作に割り当てられるコールバックです。
保留中のハンドラーや実行すべき作業がない場合、io_service::run() はすぐに戻ります。この状態は、「ブロック解除された」io_service と呼ばれます。
「ディスパッチされるハンドラーはこれ以上ありません」 説明
ドキュメントのこのフレーズは、これ以上ディスパッチされるハンドラーが存在しないことを示しています。実行を待っている未処理のハンドラー。その結果、実行すべき作業が残っていないため、io_service::run() はブロックを解除します。
例 1: TCP/IP ソケット クライアント
提供されているコード例では、io_service::run() は、TCP/IP ソケットから非同期データを受信するまでブロックします。データが利用可能になると、async_receive オペレーションのハンドラーが呼び出され、アプリケーションがデータを処理できるようになります。
例 2: ワーカー スレッドのフィボナッチ計算
ワーカー スレッドの例, io_service::run() は、すべてのフィボナッチ計算が完了するまでブロックします。作業オブジェクトは、io_service の作業不足を防ぎ、ワーカー スレッドが割り当てられたタスクの処理を継続できるようにするために使用されます。
同期操作と非同期操作
同期の混合また、非同期操作は避けてください。コード例では、io_service::run() を使用することで、非同期の async_receive 操作が効果的に同期になります。これにより、非同期プログラミングの利点が損なわれる可能性があります。
以上がBoost.Asio の io_service::run() がブロックまたはブロック解除されるのはいつですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。