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 Resolveon 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 ConnectAsync 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 が終了/タイムアウトするまで待機する必要がありますか?