boost :: asio :: io_service実行メソッドのブロック/ブロック解除時に混乱する
Boost.Asioの完全な初心者であるため、私はと混同していio_service::run()ます。このメソッドがブロック/ブロック解除するときに誰かが私に説明してくれれば幸いです。ドキュメントには次のように記載されています。 このrun()関数は、すべての作業が終了してディスパッチするハンドラーがなくなるまで、またはio_serviceが停止するまでブロックします。 複数のスレッドがrun()関数を呼び出して、io_serviceハンドラーを実行できるスレッドのプールを設定できます。プールで待機しているすべてのスレッドは同等であり、io_serviceハンドラーを呼び出すためにそれらのいずれかを選択できます。 run()関数の通常の終了は、io_serviceオブジェクトが停止していることを意味します(stopped()関数はtrueを返します)。後続の呼び出しはするrun()、run_one()、poll()またはpoll_one()前のコールがない限り、すぐに戻りますreset()。 次のステートメントはどういう意味ですか? [...]ディスパッチされるハンドラーはもうありません[...] の動作を理解しようとしているときにio_service::run()、この例(例3a)に出くわしました。その中で、私はそれio_service->run()が作業指示をブロックして待つのを観察します。 // WorkerThread invines io_service->run() void WorkerThread(boost::shared_ptr<boost::asio::io_service> io_service); void CalculateFib(size_t); boost::shared_ptr<boost::asio::io_service> io_service( new boost::asio::io_service); boost::shared_ptr<boost::asio::io_service::work> work( new boost::asio::io_service::work(*io_service)); // ... boost::thread_group worker_threads; for(int x = 0; x < 2; ++x) { worker_threads.create_thread(boost::bind(&WorkerThread, io_service)); } io_service->post( boost::bind(CalculateFib, 3)); io_service->post( boost::bind(CalculateFib, 4)); io_service->post( boost::bind(CalculateFib, 5)); work.reset(); …