Другой метод заключается в том, чтобы при запуске создавать новые () X межпотоковые экземпляры связи, помещать их в очередь и больше никогда не создавать. Поток A извлекает объекты из этой очереди пула, заполняет их данными и помещает их в очередь в поток B. Поток B получает объекты, обрабатывает их и затем возвращает их в очередь пула.
Это обеспечивает управление потоком - если поток A попытается отправить слишком быстро, пул высохнет, и A придется ждать в очереди пула, пока B не вернет объекты. У него есть потенциал для улучшения производительности, поскольку после начального заполнения пула нет malloc и освобождается - время блокировки в очереди push / pop будет меньше, чем при вызове диспетчера памяти. Нет необходимости в сложных ограниченных очередях - подойдет любой старый класс очереди производитель-потребитель. Пул можно использовать для обмена сообщениями между потоками в полном приложении с множеством потоков / threadPools, поэтому все они контролируются потоком. Проблемы с отключением могут быть смягчены - если очередь пула создается основным потоком при запуске перед любыми формами и т. Д. И никогда не освобождается, часто можно избежать явного отключения фоновых потоков при закрытии приложения - боль, о которой было бы неплохо просто забыть о , Утечки объектов и / или двойные выбросы легко обнаруживаются с помощью мониторинга уровня пула («обнаружено», а не «исправлено»:).
Неизбежные недостатки - вся память экземпляра межпотоковой связи постоянно выделяется, даже если приложение полностью бездействует. Объект, извлеченный из пула, будет полон «мусора» от его предыдущего использования. Если «самый медленный» поток получает объект до того, как его освободить, приложение может зайти в тупик с пустым пулом, и все объекты будут поставлены в очередь в самом медленном потоке. Очень тяжелый всплеск загрузки может привести к тому, что приложение будет «задушить» себя «рано», когда более простой механизм «new / queue / dispose» просто выделит больше экземпляров и, таким образом, будет лучше синхронизироваться с пакетом работы.
Rgds,
Martin