Я использую boost::asio::io_service
для управления асинхронной связью TCP. Это означает, что я создаю boost::asio::ip::tcp::socket
и передаю ему io_service
. Когда я начинаю коммуникацию, она схематично выглядит следующим образом:
Асинхронное разрешение -> Обратный вызов -> Асинхронное подключение -> Обратный вызов -> Асинхронная запись -> Обратный вызов -> Асинхронное чтение
Я пропустил такие части, как разрешение и привязка. Просто предположим, что сокет был привязан к порту, а имя хоста разрешено (поэтому соединение означает установление реального соединения с конечной точкой)
Теперь дело в том, что я могу запустить несколько асинхронных соединений с одним и тем же 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
. В четвертой строке теперь есть две разные асинхронные функции, которые необходимо выполнить.
Может ли io_service
выполнять асинхронное подключение
и асинхронную запись
одновременно?Если это так, то ясно, что всегда будет вызываться обратный вызов из функции, которая завершается первой.
Если io_service
неспособен на это, в каком порядке он будет выполнять работу? Если SocketA Async Write
будет вызван первым, его обратный вызов также будет вызван первым. На самом деле всегда будет работа, пока вся операция над SocketA не будет завершена.
РЕДАКТИРОВАТЬ:
В соответствии с комментарием ereOns я пытаюсь уточнить свой вопрос:
С точки зрения потока io_service
- это SocketA Async Connect
] вызывать асинхронно или синхронно? С точки зрения моего основного потока, это, конечно, асинхронно (он просто отправляет команду, а затем продолжает). Но будет ли этот конкретный вызов Connect
в потоке io_service
блокировать другие операции?
Другими словами: может ли один единственный io_service
подключаться к одному сокету во время чтения из другого?
Другой пример: я просто вызываю 2 Async Connect
в моей основной функции сразу друг за другом:
SocketA->AsyncConnect();
SocketB->AsyncConnect();
Допустим, хост из SocketA немного медленный, и ответ занимает две секунды. . Таким образом, пока SocketA пытается подключиться, будет ли SocketB тем временем также подключаться или ему придется ждать, пока SocketA не завершится/истечет время ожидания?