Я бы сказал, что вам не нужно ломать документированный интерфейс для объединения обоих.
Фактически документированного интерфейса достаточно, чтобы эффективно объединить несколько объектов 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 разработан для расширения и расширения.незаметно для вашего выбора дизайна.Скорее всего, вы сможете "исправить" проблемы интеграции сторонних библиотек с помощью открытого интерфейса.