Подтвердить что ты не робот

Являются ли несколько ASIO io_services хорошей?

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

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

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

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

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

4b9b3361

Ответ 1

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

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

Ответ 2

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

Ответ 3

Это обсуждение может быть полезным:

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

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

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

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