Вступить в клуб →
средняявопросСети в Linux: сокеты, epoll и Boost.Asio

После запуска io_context в четырёх потоках буфер сессии портится

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

Как правильно это исправить?

  • Выполнять обработчики сессии через её strand
  • Вернуть run() в один поток, а в остальных run_one
  • Сделать buffer_ и state_ полями std::atomic
  • Создать отдельный io_context на каждый обработчик

🔒 Проверка ответа — для участников клуба

  • Проверка ответа
  • Подсказка, если застряли
  • Разбор с объяснением, почему так
  • Прогресс по всем задачам и виртуальные собеседования
Зарегистрироваться →

Регистрация занимает минуту

Другие задачи раздела