Я рассматриваю возможность написания многопоточного TCP-сервера с использованием Boost ASIO. Я прочитал учебные пособия и просмотрел некоторые примеры и просто хочу проверить правильность моего понимания.
Сервер будет принимать соединения, а затем обслуживать запросы от нескольких клиентов.
Мое понимание заключается в следующем:
- Сервер использует «один
io_serviceи пул потоков, вызывающийio_service::run()» - Все потоки вызывают
io_service::run(). - Вызовы
io_service::run()не находятся внутри нити, поэтому обработчики завершения могут работать одновременно. - При поступлении запроса выбирается один из потоков, вызывается его обработчик чтения
- Может поступить другой запрос, запускающий обработчик чтения во втором потоке.
- Когда один из потоков завершает обработку запроса, он вызывает
async_writeизstrand - Другой поток также завершает обработку своего запроса, он также вызывает
async_writeиз цепочки. - Записи в
io_serviceсериализуются черезstrand, поэтому они потокобезопасны. - Когда операция записи завершается, поток вызывает
async_read() - Этот вызов не защищен
strand, и поток будет использоваться для обработки запросов.
Правильно ли я понимаю? Уязвимо ли это решение к условиям гонки?