ホームページ > バックエンド開発 > C++ > `boost::asio::io_service::run()` がブロックされるのはどのような場合ですか?

`boost::asio::io_service::run()` がブロックされるのはどのような場合ですか?

Linda Hamilton
リリース: 2024-11-11 12:17:03
オリジナル
497 人が閲覧しました

When Does `boost::asio::io_service::run()` Block?

boost::asio::io_service がいつ実行されるか ブロック/ブロック解除

io_service::run() のブロック動作は、作業とハンドラーの処理に起因します。 次の状態になるまでブロックされたままになります。

  • すべての作業が完了する
  • 実行するハンドラーがもう残っていません
  • io_service が停止されましたvia stop()

「これ以上ハンドラーを使用しない」というフレーズの解読Be Dispatched"

io_service::run() が「ディスパッチされるハンドラーがなくなる」までブロックされる場合、登録されたコールバックの形式で未処理のタスクがないことを意味します。

の動作コード例

例 3a: ブロック

最初の例 (3a) では、 io_service は、ポストされた 3 つのフィボナッチ計算ハンドラーがすべて実行されるまで、run() 内でブロックされます。

詳細な実行フロー:

  1. io_service::work は、run() からすぐに戻らないように作成されます。
  2. io_service を実行するためにワーカー スレッドが起動されますループ。
  3. フィボナッチ計算のハンドラーがポストされます。
  4. io_service::work がリセットされ、run() が終了できるようになります。
  5. ワーカー スレッドが結合し、タスクの完了を示します。

クライアント コード: 非同期だが効果的同期

クライアント コードは非同期 I/O (async_receive) を使用しているように見えますが、実際には同期的に動作します。

実行フロー:

  1. async_receive() は、非同期操作。
  2. io_service::run() は、操作が完了するかエラーが発生するまでブロックされます。
  3. 制御は呼び出し元のスレッドに戻り、ハンドラーが実行されます。

対応する同期:

同等の同期操作は次のようになります。

boost::asio::error_code error;
std::size_t bytes = socket.receive(buffer, error);
// Execute handler with error and bytes
ログイン後にコピー

一般的なガイドライン: 同期操作と非同期操作を分離する

同期操作と非同期操作を混在させると、複雑さが生じる可能性があります。この慣行を避けることを検討してください。 Boost.Asio ドキュメントは、非同期プログラミングの利点に関する貴重な洞察を提供します。

以上が`boost::asio::io_service::run()` がブロックされるのはどのような場合ですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート