## Эмпирическое правило |
|
Все классы не являются потокобезопасными для одновременного доступа из нескольких |
потоков, если иное явно не указано. |
|
В целом, есть несколько потокобезопасными классов в 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()` |
оно должно сделать это с помощью метода `cppcms::service::post()` |
и соответствующего обработчика исполнения. |
|
Этот обработчик будет передан в очередь цикла обработки событий |
и выполнен в его потоке. |
|
Если асинхронное приложение или любой другой объект, |
работающий в цикле обработки событий хочет выполнить какую-либо |
продолжительную работу, блокирующую или тяжелую операцию, |
оно может сделать это передачей обработчика исполнения в потоковый пул. |
|
Обратите внимание, что как только работа будет завершена, обработчик должен уведомить |
о своем завершении, "отпостив" какой-либо обработчик в цикл обработки событий так же, |
как описано выше. |
|
Различные приложения никогда не должны получать доступ к своим |
внутренним состояниям непосредственно, т.к. это небезопасно. |