Я часто использую такую модель в различных системах.Я определяю класс для агентов, скажем «AgentClass» и один для запросов, скажем «RequestClass».Агент имеет два абстрактных метода: submit (RequestClass * message) и signal ().Как правило, поток в агенте создает очередь производителя-потребителя и ожидает в нем экземпляров RequestClass, метод submit () ставит в очередь переданные экземпляры RequestClass в очередь.RequestClass обычно содержит перечисление «command», которое сообщает агенту, что нужно делать, вместе со всеми данными, необходимыми для выполнения запроса, и экземпляром агента «sender».Когда агент получает запрос, он включает перечисление, чтобы вызвать правильную функцию для выполнения запроса.Агент действует только на данные в RequestClass - результаты, сообщения об ошибках и т. Д. Помещаются в элементы данных RequestClass.Когда агент выполнил запрос (или потерпел неудачу и сгенерировал данные об ошибках), он может либо отправить () запрос обратно отправителю (т. Е. Запрос был выполнен асинхронно), либо вызвать функцию signal () отправителей,whch сигнализирует о событии, которое ожидал отправитель (т. е. запрос был выполнен синхронно).
Обычно при запуске я создаю фиксированное количество экземпляров RequestClass и сохраняю их в глобальной очереди пула «пул».Любой агент / поток / что-либо, кроме того, что необходимо для отправки запроса, может удалить из очереди экземпляр RequestClass, заполнить данные, передать их () агенту, а затем асинхронно или синхронно ожидать выполнения запроса.Когда это сделано, RequestClass возвращается в пул.Я делаю это, чтобы избежать непрерывного malloc / free / new / dispose, облегчить отладку (я сбрасываю уровень пула в строку состояния с помощью таймера, поэтому я всегда замечаю, утечка или двойной запрос освобождается), и для устранениянеобходимость явного завершения потока при закрытии приложения (если несколько потоков только когда-либо читают / записывают данные в области данных, которые переживают формы приложения и т. д., приложение легко закрывается, и ОС может обрабатывать все потоки - существуют сотни сообщений о«Чистое завершение потоков при закрытии приложения» - я никогда не беспокоюсь!).
Такие конструкции передачи сообщений довольно устойчивы к взаимоблокировкам, поскольку единственные блокировки (если они есть) находятся в очередях ПК, хотя выможет, конечно, добиться этого, если вы попытаетесь достаточно усердно:)
Это та система, которая вам нужна, или я ошибся?
Rgds, Martin