получение дескриптора epoll из объекта boost asio io_service - PullRequest
0 голосов
/ 25 октября 2018

Можем ли мы получить дескриптор epoll, лежащий в основе объекта boost asio io_service ??у нас есть несколько объектов boost asio io_service в нашем приложении, один из библиотеки, а другой - родной для приложения, объект io_service из библиотеки - это серверный объект, обслуживающий несколько соединений, мы изучаем, как лучше всего мы можем эффективно координировать несколько объектов io_service.

Ответы [ 2 ]

0 голосов
/ 26 октября 2018

В последних версиях boost есть методы run_for и run_until, мы можем ожидать первый объект службы io в течение определенного времени и можем вызывать опрос для второго объекта службы io, когда первый из них возвращается или истекает время ожидания.

0 голосов
/ 25 октября 2018

Я бы сказал, что вам не нужно ломать документированный интерфейс для объединения обоих.

Фактически документированного интерфейса достаточно, чтобы эффективно объединить несколько объектов io_service.

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

Как и в документах говорится :

Интерфейс библиотеки отделен от интерфейсов для создания потоков и управления ими и разрешает реализации на платформах, где потоки недоступны.

И примечания по реализации для конкретной платформы обещание (в несколько иной, но по существу схожей формулировке):

Демультиплексирование с использованием epoll выполняется в одном из потоков, который вызывает io_context :: run (), io_context :: run_one (), io_context:: poll () или io_context :: poll_one ().

Это ваша подсказка.Вы можете связать множество io_service в один цикл обработки событий, используя poll_one() (или даже run_one()).Фактически, этот механизм может использоваться для интеграции с любой подсистемой событий сторонней организации, которую вы хотите (libev, Qt idle work и т. Д.).Вы можете вызвать poll_one() в ответ на аппаратное прерывание в системах, которые не поддерживают потоки.

В качестве дополнительного примечания, обратное - позволить другим библиотекам выполнять собственные операции с сокетами с ASIO.Выполнение опроса: Операции в стиле Reactor .

Оба эти подхода можно объединить.

Резюме

Повышение Asio разработан для расширения и расширения.незаметно для вашего выбора дизайна.Скорее всего, вы сможете "исправить" проблемы интеграции сторонних библиотек с помощью открытого интерфейса.

...