Блокирование ускорения рабочих потоков Asio - PullRequest
0 голосов
/ 16 февраля 2012

Я разрабатываю сетевой сервер на основе Boost :: Asio .

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

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

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

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

  • Приводит ли (возможно, значительная работа) к потокам ввода-вывода io_service какое-либо горе?

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

1 Ответ

1 голос
/ 20 февраля 2012

Может ли выполнение (возможно, значительная работа) потоков IO вызвать у io_service какое-либо горе?

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

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

...