В моем приложении я буду получать различные события, которые я хотел бы обрабатывать асинхронно в порядке приоритетов.
Я мог бы сделать это с boost::asio::io_service
, но мое приложение однопоточное. Я не хочу платить за замки и mallocs
вам может понадобиться многопоточная программа (для меня стоимость производительности действительно значительна). Я в основном ищу boost::asio::io_service
это написано для однопоточного исполнения.
Я уверен, что мог бы реализовать это сам, используя boost::coroutine
, но прежде чем сделать, что-то вроде boost::asio::io_service
что написано для однопоточного исполнения уже существует? Я уже просмотрел список буст-библиотек, и мне ничего не выделялось
Знать, что ты иметь платить за синхронизацию, как только вы используете любые неблокирующие звонки Asio.
Даже если вы можете использовать один поток для планирования работы и обработки полученных обратных вызовов, Asio, возможно, все равно придется порождать дополнительные потоки внутри для выполнения асинхронных вызовов. Те получат доступ к io_service
одновременно.
Думать о async_read
на сокете: как только полученные данные становятся доступными, сокет должен уведомить io_service
, Это происходит одновременно с вашим основным потоком, поэтому требуется дополнительная синхронизация.
Для блокирования ввода-вывода эта проблема теоретически решена, но поскольку асинхронный ввод-вывод является своего рода целью библиотеки, я не ожидал бы найти слишком много оптимизаций для этого случая в реализации.
Как это было указал в комментариях уже спор о io_service
будет очень низким только с одним основным потоком, поэтому, если профилирование не указывает на явное узкое место в производительности, вам не следует слишком беспокоиться об этом.
Я предлагаю использовать boost :: asio вместе с boost :: coroutine -> boost :: asio :: yield_context (уже связывает coroutine + io_service). Если вы обнаружите задачу с более высоким приоритетом, вы можете приостановить текущую задачу и начать обработку задачи с более высоким приоритетом.
Проблема заключается в том, что вы должны определить / вызвать определенные контрольные точки в коде вашей задачи, чтобы приостановить задачу, если задано условие (поставленная в очередь задача выше).