Повышение: однопоточный сервис ввода-вывода

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

Я мог бы сделать это с boost::asio::io_service, но мое приложение однопоточное. Я не хочу платить за замки и mallocs вам может понадобиться многопоточная программа (для меня стоимость производительности действительно значительна). Я в основном ищу boost::asio::io_service это написано для однопоточного исполнения.

Я уверен, что мог бы реализовать это сам, используя boost::coroutine, но прежде чем сделать, что-то вроде boost::asio::io_service что написано для однопоточного исполнения уже существует? Я уже просмотрел список буст-библиотек, и мне ничего не выделялось

0

Решение

Знать, что ты иметь платить за синхронизацию, как только вы используете любые неблокирующие звонки Asio.

Даже если вы можете использовать один поток для планирования работы и обработки полученных обратных вызовов, Asio, возможно, все равно придется порождать дополнительные потоки внутри для выполнения асинхронных вызовов. Те получат доступ к io_service одновременно.

Думать о async_read на сокете: как только полученные данные становятся доступными, сокет должен уведомить io_service, Это происходит одновременно с вашим основным потоком, поэтому требуется дополнительная синхронизация.

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

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

2

Другие решения

Я предлагаю использовать boost :: asio вместе с boost :: coroutine -> boost :: asio :: yield_context (уже связывает coroutine + io_service). Если вы обнаружите задачу с более высоким приоритетом, вы можете приостановить текущую задачу и начать обработку задачи с более высоким приоритетом.
Проблема заключается в том, что вы должны определить / вызвать определенные контрольные точки в коде вашей задачи, чтобы приостановить задачу, если задано условие (поставленная в очередь задача выше).

1