boost::asio::io_service
いくつかの非同期 TCP 通信を管理するために使用しています。つまり、 を作成し、boost::asio::ip::tcp::socket
それに を渡しio_service
ます。通信を開始すると、概略的には次のようになります。
Async Resolve -> Callback -> Async Connect -> Callback -> Async Write -> Callback -> Async Read
resolve や bind などの部分は省略しました。Socket がポートにバインドされており、ホスト名が解決されていると仮定してください (したがって、接続はエンドポイントへの実際の接続を確立することを意味します)。
ポイントは、同じio_service
オブジェクトで複数の非同期接続を開始できることです。これは、たとえば、私のio_service
スレッドでプログラムがAsync Write
何らかのデータを処理しようとしている間に、メインスレッドがAsync Resolve
on Socket で呼び出すことを意味します (ただし、同じio_service
です)。これは、io_service
現在、並行して行う作業があることを意味します。知りたいのは、作業の優先順位をどのようにするかです。
例えばこんな感じです
Main Thread | io_service Thread
-------------------------+-----------------------------------------------
SocketA->Async Connect |
//Some other Stuff | SocketA->Callback from Async Connect
| SocketA->Async Write
SocketB->Async Connect |
| --> ?
この時点で、私はそれがどのように機能するのかよくわからないことを認めなければなりませんio_service
. 4 行目には、実行する必要がある 2 つの異なる非同期関数があります。
と を同時にio_service
行うことができますか? その場合、最初に終了した関数からのコールバックが常に呼び出されることは明らかです。Async Connect
Async Write
がそうすることio_service
ができない場合、どの順序で作業を行いますか? が最初に呼び出される場合SocketA Async Write
、そのコールバックも最初に呼び出されます。実際には、SocketA での操作全体が完了するまで、常に作業が行われます。
編集 :
ereOns のコメントによると、質問をもう少し正確にしようとしています。
io_service
スレッドの観点から-SocketA Async Connect
呼び出しは非同期ですか、それとも同期ですか? 私のメインスレッドの観点からは、もちろん非同期です(コマンドをディスパッチしてから続行します)。しかし、io_service
スレッドでは、この特定Connect
の呼び出しは他の操作をブロックしますか?
言い換えればio_service
、1 つのソケットが別のソケットを読み込んでいる間に、1 つのソケットに接続できますか?
Async Connect
もう 1 つの例は、メイン関数で2 を次々に呼び出した場合です。
SocketA->AsyncConnect();
SocketB->AsyncConnect();
SocketA からのホストが少し遅く、応答に 2 秒かかるとします。したがって、SocketA が接続しようとしている間に SocketB も接続しますか、それとも SocketA が終了/タイムアウトするまで待機する必要がありますか?