Как работает расстановка приоритетов boost::asio::io_service?

Я использую 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 не завершится/истечет время ожидания?

7
задан Sam Miller 30 September 2012 в 14:15
поделиться