Я предполагаю, что у вас есть профиль, и вы измерили свой код после выполнения всего этого создания и убедились, что создание / уничтожение действительно вызывает проблему. Иначе это то, что вы должны сделать в первую очередь.
Если вы все еще хотите выполнить объединение объектов, в качестве первого шага вы должны убедиться, что ваши объекты не содержат состояний, что является необходимым условием для повторного использования объекта. Точно так же вы должны убедиться, что члены объекта и сам объект не имеют проблем с использованием из других потоков, отличных от того, который его создал. (Объекты COM STA / дескрипторы окон и т. Д.)
Если вы используете Windows и COM, одним из способов использования пула, предоставляемого системой, было бы написание свободных потоковых объектов и включение пула объектов, что сделает выполнение COM + (ранее известное как MTS) для вас. Если вы используете какую-то другую платформу, такую как Java, возможно, вы могли бы использовать серверы приложений, которые определяют интерфейсы, которые должны реализовывать ваши объекты, а сервер COM + мог бы сделать пул за вас.
или вы можете свернуть свой собственный код. Но вы должны попытаться выяснить, есть ли шаблон для этого, и если да, используйте его вместо того, что следует ниже
Если вам нужно развернуть собственный код, создайте динамически растущую коллекцию, которая отслеживает уже созданные объекты. Используйте вектор предпочтительно для коллекции, так как вы будете только добавлять в коллекцию, и было бы легко обойти его в поисках свободного объекта. (при условии, что вы не удаляете объекты в пуле). Измените тип коллекции в соответствии с вашей политикой удаления (вектор указателей / ссылок на объекты, если вы используете C ++, чтобы удалить и воссоздать объект в том же месте)
Каждый объект должен отслеживаться с использованием флага, который может быть прочитан энергозависимым образом и изменен с использованием функции блокировки, чтобы пометить его как использованный / не использованный.
Если все объекты используются, вам нужно создать новый объект и добавить его в коллекцию. Перед добавлением вы можете получить блокировку (критическая секция), пометить новый объект как используемый и выйти из блокировки.
Измерение и продолжение - возможно, если бы вы реализовали вышеупомянутую коллекцию как класс, вы могли бы легко создать разные коллекции для разных типов объектов, чтобы уменьшить конфликт блокировок из потоков, выполняющих разную работу.
Наконец, вы могли бы реализовать перегруженный интерфейс фабрики классов, который может создавать все виды объединенных объектов и знать, какая коллекция содержит какой класс
Вы можете оптимизировать этот дизайн оттуда.
Надеюсь, это поможет.