После запуска io_context в четырёх потоках буфер сессии портится
Сервер на Boost.Asio работал в одном потоке. Для роста пропускной способности io.run() запустили в 4 потоках. Сессия одновременно ждёт чтения из сокета и срабатывания таймера неактивности, оба обработчика трогают session.buffer_ и session.state_. Появились редкие падения, ThreadSanitizer показывает гонку между этими обработчиками.
Как правильно это исправить?
- Выполнять обработчики сессии через её strand
- Вернуть run() в один поток, а в остальных run_one
- Сделать buffer_ и state_ полями std::atomic
- Создать отдельный io_context на каждый обработчик
