В сети есть много примеров создания простого пула потоков, таких как Sample1 а также Sample2
Однако я хотел реализовать отдельный пул потоков для разных задач. Например, приложение может иметь пул потоков для обработки входящих tcp-соединений (назовем это сетевым пулом), а другой пул для связи с базой данных (пул баз данных).
Эти входящие tcp-запросы могут требовать информацию из базы данных. В этом случае потребуется запросить эти потоки из пула базы данных для выполнения запроса и вернуть результат асинхронно.
Есть ли рекомендуемый способ сделать это с помощью boost :: asio? Будет ли это иметь один экземпляр io_service для каждого пула? И как эти потоки должны общаться друг с другом (используя boost)?
Я понимаю, что для объяснения всего этого код не будет таким коротким и тривиальным, но, если возможно, некоторый псевдокод будет высоко цениться.
Спасибо!
Связь между потоками / пулами потоков должна осуществляться через потокобезопасные очереди.
В вашем примере у вас должен быть пул сетевых потоков для обработки сетевых подключений, пул процессов для выполнения сетевых запросов и пул соединений с базами данных / пул потоков (один пул на базу данных; один поток на соединение с базой данных, но, возможно, у вас может быть несколько подключения к той же базе данных).
Вам также потребуются многопоточные очереди, одна для сетевого пула, одна для пула процессов и одна для каждого из пулов базы данных.
Скажем, у вас есть сетевой запрос, который должен получить информацию из базы данных. Вы получите запрос при выполнении в сетевом потоке и добавите обработчик запроса в очередь процесса.
Обработчик процесса (в потоке процесса) увидит, что запросу требуется что-то из базы данных, и поэтому он добавит запрос базы данных, а также обработчик обратного вызова в соответствующую очередь базы данных.
Соответствующий поток базы данных получит запрос из очереди базы данных, выполнит запрос, вернет результаты и добавит результаты в обработчик обратного вызова. Объект обработчика обратного вызова с результатами базы данных будет затем помещен в очередь процесса.
Обработчик обратного вызова (в потоке процесса) затем продолжит выполнение запроса и, возможно, упакует ответное сообщение, которое затем помещается в сетевую очередь.
Сетевой обработчик (в сетевом потоке) будет тогда получать ответное сообщение и доставлять его (при необходимости кодируя).
Пример потокобезопасной очереди можно найти Вот.
Хотя и немного сложнее, вы можете увидеть реализацию сервера приложений, который может обрабатывать то, о чем вы говорите Вот, хотя это может быть излишним для того, что вы пытаетесь сделать. Исходный код довольно хорошо документирован, поэтому вы должны иметь возможность следить за ним и видеть, что он делает.
Мой пример использует boost для asio (см. Реализация TCP-соединения в той же системе), но он не использует boost io_service для обработчиков.
Других решений пока нет …