Многопоточный сервер с boost asio - PullRequest
2 голосов
/ 15 января 2012

Я смотрю на создание многопоточного TCP-сервера с использованием Boost ASIO.Я прочитал учебные пособия, посмотрел некоторые примеры и просто хочу убедиться, что мое понимание верно.

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

Мое понимание таково:

  1. Сервер использует "один io_service и пул потоков, вызывающий io_service::run()"
  2. Все потоки вызывают io_service::run().
  3. Вызовы io_service::run() не находятся внутри цепочки, поэтому обработчики завершения ergo могут выполняться одновременно.
  4. Когда приходит запрос, выбирается один из потоков, его обработчик чтения будет называться
  5. Может появиться другой запрос, запускающий обработчик чтения во втором потоке
  6. Когда одиниз потоков завершил обработку запроса, который он вызывает async_write изнутри strand
  7. Другой поток также завершает обработку своего запроса, он также вызывает async_write изнутри нити
  8. Записи в io_service сериализуются через strand, поэтому они являются потокобезопасными.
  9. Когда операция записи завершает поток, вызывает async_read()
  10. Этот вызов не защищенstrand и поток будет использоваться для обработки запросов

Правильно ли мое понимание?Является ли это решение уязвимым для условий гонки?

1 Ответ

3 голосов
/ 16 января 2012

Как сказал Сэм Миллер, ваши предположения вполне верны.

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

Правильно, что нити будут сериализовать async_write(s) и, следовательно, там будет потокобезопасным.Но проблема не в этом, async_write является поточно-безопасным, если не используется в одном сокете.И пряди здесь не помогут, так как вы не должны чередовать async_write в том же сокете.

Strands не будет ждать завершения предыдущего async_write перед вызовом следующего.вам нужно будет создать структуру async_write только в том случае, если ни одна из них уже не работает в сокете.

...