14

asioチャットサーバーの例を調べていました。私の質問は、io_service.run()関数の使用法についてです。io_service.run()関数のドキュメントには次のように書かれています。

run()関数は、すべての作業が終了してディスパッチするハンドラーがなくなるまで、またはio_serviceが停止するまでブロックします。複数のスレッドがrun()関数を呼び出して、io_serviceがハンドラーを実行できるスレッドのプールを設定する場合があります。プールで待機しているすべてのスレッドは同等であり、io_serviceはそれらのいずれかを選択してハンドラーを呼び出すことができます。run()関数は、reset()を呼び出した後でのみ完了すると、安全に再度呼び出すことができます。

run関数が返されると書かれており、返されるとネットワークスレッドは再度呼び出されるまで停止すると思います。それが本当なら、なぜ実行関数がループで呼び出されないのか、少なくとも独自のスレッドが与えられないのですか?機能は私にio_service.run()はかなり謎です。

4

1 に答える 1

19

「すべての作業が終了し、ディスパッチするハンドラーがなくなるまで、またはio_serviceが停止するまで」

実行のたびに自分自身を再インストールする、という名前のハンドラーをインストールすることに注意してくださいhandle_acceptしたがって、io_service.run少なくとも手動で終了するまで、は戻りません。

基本的に、スレッドでio_service.runを実行すると、インストールしたハンドラーを使用して、io_servicesプロアクターがプログラムフローを引き継ぎます。handle_acceptその時点から、通常の手続き型プログラムフローではなく、イベント(など)に基づいてプログラムを処理します。あなたが言及しているループは、asioのプロクターの恐ろしい深さのどこかにあります;-)。

于 2009-12-30T21:45:44.960 に答える