Потокобезопасность
Эмпирическое правило
Все классы не являются потокобезопасными для одновременного доступа из нескольких потоков, если иное явно не указано.
В целом, есть несколько потокобезопасными классов в CppCMS, к методам которых возможен одновременный доступ из нескольких потоков:
cppcms::service
cppcms::applications_pool
cppcms::thread_pool
cppcms::views::pool
booster::aio::io_service
Во всех остальных случаях следует принимать особые меры в целях предотвращения доступа к одному и тому же классу из нескольких потоков.
Потоки в CppCMS
Есть несколько типов потоков в CppCMS:
- Цикл обработки событий (Event Loop) - главный поток, запускающий
cppcms::service::run()
потоков. - Потоковый пул (Thread Pool) - специальный пул потоков, в котором выполняются все синхронные запросы.
- Некоторые фоновые потоки - вспомогательные потоки, которые в основном малоинтересны.
Взаимодействие между потоками
Сразу после запуска CppCMS-сервиса все синхронные приложения начинают выполняться в потоковом пуле.
Если синхронное приложение CppCMS хочет выполнить
какую-либо операцию в цикле обработки событий, например,
взаимодействовать с некоторым асинхронным приложением
передачей каких-нибудь данных или передачей ему своего HTTP-контекста,
оно должно сделать это с помощью метода cppcms::service::post()
и соответствующего обработчика исполнения.
Этот обработчик будет передан в очередь цикла обработки событий и выполнен в его потоке.
Если асинхронное приложение или любой другой объект, работающий в цикле обработки событий хочет выполнить какую-либо продолжительную работу, блокирующую или тяжелую операцию, оно может сделать это передачей обработчика исполнения в потоковый пул.
Обратите внимание, что как только работа будет завершена, обработчик должен уведомить о своем завершении, "отпостив" какой-либо обработчик в цикл обработки событий так же, как описано выше.
Различные приложения никогда не должны получать доступ к своим внутренним состояниям непосредственно, т.к. это небезопасно.