У меня проблема с производительностью, когда клиенты создают сотни объектов определенного типа "Foo" в DOM моего приложения C++. У каждого экземпляра Foo есть собственная асинхронная рабочая очередь с собственным потоком. Очевидно, что это не масштабируется.
Мне нужно разделить потоки между рабочими очередями, и я не хочу изобретать велосипед. Мне нужно поддерживать XP, поэтому я не могу использовать пул потоков Vista/Win7. Работа, которую необходимо выполнить для обработки каждого элемента очереди, включает в себя вызовы COM в многопоточном апартаменте COM. В документации для пула потоков XP говорится, что можно вызывать CoInitializeEx() с апартаментом MTA в обратном вызове функции рабочего потока. Я написал тестовое приложение и убедился, что оно работает. Я заставил приложение выполнить 1 миллион итераций с парой CoInitializeEx/CoUninitialize и без нее в функции обратного вызова WorkItem. Это занимает 35 секунд с вызовами CoInit* и 5 секунд без них. Это слишком много накладных расходов для моего приложения. Поскольку пул потоков предназначен для каждого процесса, а сторонний код выполняется в моем процессе, я предполагаю, что небезопасно использовать CoInitializeEx() один раз для каждого потока и никогда не использовать CoUninitialize().
Учитывая все это, могу ли я каким-либо образом использовать пул потоков Win32? Я что-то упустил, или пул потоков XP совершенно бесполезен для высокопроизводительных COM-приложений? Мне просто придется создать свою собственную систему разделения потоков?