2015-06-30 3 views
5

Следующая схема приходят из подталкивание ASIO документации:Каково влияние вызова io_service :: запустить метод дважды

enter image description here

Я понимаю, что если я называю io_service::run метод дважды (в двух отдельных потоках), я будет иметь два потока для детекции событий от завершения очереди событий через асинхронный демультиплексор событий, верно?

Точнее, я сомневаюсь в достижении параллелилизации путем множественного вызова метода io_service::run. Например, при работе с сокетом, если, например, у меня есть два сокета, связанных на одном io_service object, каждый сокет, вызывающий метод socket.async_read_some, включает ли он два зарегистрированных обратных вызова (через метод async_read_some), которые можно вызвать при вызове io_service::run дважды.

+1

Вы понимаете это правильно. Вот полезная ссылка, которая подробно объясняет это: http://theboostcpplibraries.com/boost.asio-scalability –

ответ

4

Ваши предположения верны. Каждый поток, который вызывает io_service::run(), будет деактивировать и выполнить обработчики (объекты простой функции) параллельно. Это, конечно, имеет смысл, если у вас есть несколько источников событий, которые кормят io_service (например, два сокета, сокет и таймер, несколько одновременных звонков post() и т. Д.).

Каждый вызов сокета async_read() приведет к тому, что один обработчик будет поставлен в очередь в io_service. Только один из ваших потоков удалит его и выполнит.

Будьте внимательны, чтобы не называть async_read() более одного раза за раз на сокет.

Смежные вопросы