2012-02-16 6 views
0

Я разрабатываю сетевой сервер на основе Boost :: Asio.Блокировка Boost Asio Рабочие темы

У меня есть boost::thread_group рабочих потоков ввода-вывода, которые я использую, чтобы позвонить boost::asio::io_service::run()

Когда сетевой активности происходит ASIO использует один из этих рабочих потоков для обработки активности (например, принимать или прием).

Мое приложение затем выполняет некоторую работу, возможно, некоторые вычисления, возможно, некоторые другие IO (через boost) и, возможно, некоторые действия с базой данных.

Я хотел бы знать, что подразумевает выполнение указанной работы в этих потоках. В частности:

  • ли проведение (возможно, значительную работу) на резьбе IO вызывают в io_service любое горе?

И менее конкретно: любые другие вопросы, о которых я должен думать.

+1

Непонятно, что вы имеете в виду, перейдя в «boost :: asio» из рабочего потока. Я ожидал бы, что все рабочие потоки добавят дополнительную работу в 'io_service', иначе цикл обработки событий (' io_service :: run() ') завершится. –

+0

@ Сэм, спасибо. Думаю, я, наверное, слишком беспокоюсь об этом конкретном вопросе. Я отредактирую вопрос. Я думаю, что я действительно беспокоюсь о том, что слишком много работы внутри рабочих потоков. – Nick

ответ

1

Выполнение (возможно, значительная работа) на резьбах IO вызывает io_service любое горе?

Это действительно зависит от того, что вы имеете в виду от горя. Выполнение длительных операций в обработчике, вызываемом io_service, может блокировать дополнительные обработчики от вызова io_service. Рассмотрим простейший пример с одним потоком, вызывающим io_service::run(). Если обработчик, вызванный асинхронной операцией, скажем async_read(), затем выполняет некоторые операции с базой данных, которые могут быть длинными, дополнительные выдающиеся асинхронные операции не будут вызывать их обработчики до тех пор, пока длительная работа не будет завершена, и обработчик вернет управление на io_service.

Это обычно смягчается путем вызова io_service::run() из нескольких потоков и с использованием strand для обеспечения эксклюзивного доступа к обработчикам, использующим общие данные. Хотя, если все ваши обработчики выполняют несколько длительных операций, вам может потребоваться изучить альтернативные проекты.