[boost.asio] Как передать доп. параметр в io_service::run
От: dimchick Украина  
Дата: 09.01.10 15:46
Оценка:
Привет,

Я новичек в Boost::Asio. Пытаюсь перейти на эту либу в своем приложении чтобы избавиться от велосипедов.

Поблема в том, что существующая архитектура приложения не совсем состыковывается с архитектурой, которую предлагает Boost. Я не могу найти способ передать дополнительный параметр из рабочего потока, выполняющего io_service::run, в completion функцию, которая обрабатывает событие получение данных.

Раскажу немного о приложени. Может это както поможет.

1. Это сетевое low-latency приложение. Ожидается скорость обработки ~10 микросек/сообщ.
2. Приложение обрабатывает входящие multicast UDP сообщения.
3. Количество мультикаст групп не ограничено.

Тех детали:

1. Приложение инкапсулирует udp::socket-ы, подписанные на мультикаст рассылку
2. Метод udp::socket::async_receive используется для получения данных
3. io_service::run вызывается в каждом потоке пула, чтобы завершить обработку входящих собщений.
4. Каждый поток инкапсулирует некий объект, выполняищий обработку UDP собщений.

Мне как-то нужно передать ссылку на этот объект в функцию завершения ввода/вывода. Существующие решения не совсем подходят.
— Держать пул этих объектов гиморно, нужно заботиться о синхронизации, использовать локи
— Создавать для каждого сокета по такому объекту накладно, потому что объект выделает большие объемы памяти. А сокетов может быть очень много.
— Использовать thread_local_storage похоже на убийство воробьев из пушки
— использовать null_buffers не хочу, потому как это приводит к лишним переключениям в режим ядра (два вместо одного) или копированиям. Хз — это все догадки, деталей не знаю.

Знаю что это должно быть както просто, потому как POSIX и Windows I/O никаких ограничений на эту возможность не накладывают. Если бы писал на API, то проблем бы небыло.

Помогите плз советом. Как решить эту проблему?

Спасибо.

Дима

09.01.10 21:54: Перенесено из 'C/C++'
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.