Является ли несколько ASIO io_services хорошей вещью? - PullRequest
20 голосов
/ 19 мая 2011

Я начал использовать Boost.ASIO для простого сетевого программирования, мое понимание библиотеки невелико, поэтому, пожалуйста, ответьте на вопрос меня и моего новичка.

В данный момент в моем проектеУ меня есть только 1 io_service объект.Который используется для всех операций асинхронного ввода-вывода и т. Д.

Насколько я понимаю, можно создать несколько потоков и передать потоку экземпляр экземпляра io_service в поток, чтобы предоставить больше потоков для io_service.

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

Мое намерениедолжен иметь 1 io_service для ввода-вывода на основе сокетов и другой для последовательного (tty) ввода-вывода.

Ответы [ 3 ]

16 голосов
/ 19 мая 2011

Мы используем несколько io_service, потому что некоторые компоненты в нашем приложении должны запускать все свои рабочие потоки с определенными фиксированными приоритетами, отличающимися для каждого компонента. Таким образом, каждому компоненту предоставляется свой собственный io_service, и каждый компонент имеет свой собственный пул потоков, выполняющих run().

Другие конструкции, о которых я мог бы подумать, были бы, если бы для каждого ввода-вывода требовалось разное количество потоков в пуле, или, что более уместно в вашем случае, если пул не может быть общим, потому что, например, если ваш сетевой IO может удалить все потоки и оставить ваш последовательный ввод-вывод в ожидании.

7 голосов
/ 19 мая 2011

IIRC, во время выступления Майкла Кейсса в Boostcon ASIO (который стоит посмотреть в любом случае), я полагаю, что этот вопрос явно задан членом аудитории и одобрен как потенциальное решение.Я понимаю, что это не так само по себе и может быть использовано таким образом в соответствии с вашим замыслом.

6 голосов
/ 19 мая 2011

Эта дискуссия может быть поучительной:

http://thread.gmane.org/gmane.comp.lib.boost.asio.user/1300

У меня нет кода прямо здесь, но зачем вам использовать несколько io_services? Я думал, что он использовал один io_service и несколько потоков, выполняющихся на тот один io_service.

IIUC, каждый io_service владеет очередью select / epoll / независимо от того, что несколько io_services сродни наличию нескольких независимых циклов select / epoll. В некоторых ситуации, например. это может помочь при большом количестве сокетов и нескольких процессоров.

Кое-что, в чем я менее уверен, так это запуск нескольких потоков io_service :: run (с тем же io_service). Я думаю, что это просто означает, что обработчики запускаются одновременно, в то время как select / epoll / etc. цикл является «общим». Я думаю, что это лучше всего, когда ваши обработчики являются относительно длительными операции.

...