Понимание времени жизни приложения с помощью cppcms - PullRequest
0 голосов
/ 15 февраля 2019

Википедия cppcms утверждает, что (выделение мое):

Синхронные приложения живут в пуле.Они генерируются специальным объектом cppcms :: Applications_pool :: factory, который монтируется в объект Applications_pool.

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

По входящему запросу приложение извлекается из пула или создается новое. Назначается специальный объект cppcms :: http :: contextприложению во время всей обработки запроса:

Этот запрос обрабатывается в пуле потоков путем вызова виртуальной функции application :: main (), которая фактически обрабатывает запрос.

После того, какзапрос завершен, этот контекст не назначен, и приложение возвращается в пул для последующего повторного использования.

Поэтому, когда вы пишете свои собственные приложения, вы можете предположить, что их конструкторы не были вызванычасто .Вы также должны предположить, что они будут «поддерживаться в течение длительного времени».

Хорошей идеей является кэширование некоторой общей неизменяемой информации с помощью таких объектов.

При стрельбе 2Запросы одновременно (или с задержкой меньше, чем время до завершения), будет ли сгенерировано 2 экземпляра приложения ?

В тексте написано, что приложение выбрано из пула и возвращено после завершения запроса.И на странице о безопасности потоков упоминается, что

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

и не упоминает класс cppcms::application.

Означает ли это, что:

  1. Я не могу быть уверен, что все запросы будут обрабатываться одним и тем же объектом приложения?
  2. Я не могу создать статический метод получения объекта приложения, потому что другой рабочий поток может выполнить второй запрос, используя другой объект приложения и, следовательно, разрешить гонки данных?
...