Во-первых, чтобы извлечь выгоду из многопоточности, вам нужно найти одинаково медленные задачи для каждого потока.Вы сказали, что обработка каждого объекта занимает .5s +, сколько времени занимает чтение файла / создание объекта?Это может легко составить десятую или тысячную часть этого времени, и в этом случае ваш многопоточный подход принесет незначительную выгоду.Если это так (да, я скоро отвечу на ваш первоначальный вопрос, если это не так), то подумайте об одновременной обработке нескольких объектов.Поскольку ваша обработка занимает довольно много времени, накладные расходы на создание потока не очень значительны, так что вы можете просто сделать так, чтобы ваш основной поток чтения файлов / создания объектов порождал новый поток и направлял его на вновь созданный объект.Затем основной поток продолжает чтение / создание последующих объектов.Когда все объекты прочитаны / созданы и все потоки обработки запущены, основной поток «присоединяет» (ждет) рабочие потоки.Если это создаст слишком много потоков (тысяч), тогда наложите ограничение на то, насколько далеко может пройти основной поток: он может читать / создавать 10 объектов, затем присоединяться к 5, затем читать / создавать 10, присоединяться к 10, читать / создавать10, присоединитесь к 10 и т. Д., Пока не закончите.
Теперь, если вы действительно хотите, чтобы чтение / создание было параллельно с обработкой, но обработка была сериализована, то вы все равно можете использовать вышеуказанный подход, но присоединитьсяпосле каждого объекта.Это немного странно, если вы разрабатываете это с учетом только этого подхода, но хорошо, потому что вы также можете легко поэкспериментировать с описанным выше параллелизмом обработки объектов.
В качестве альтернативы, вы можете использовать более сложный подход, который простовключает основной поток (который ОС создает при запуске вашей программы) и один рабочий поток, который должен запускаться основным потоком.Они должны координироваться с использованием мьютекса (переменной, обеспечивающей взаимоисключающий, что означает не-одновременный доступ к данным), и условной переменной, которая позволяет рабочему потоку эффективно блокировать, пока основной поток не предоставит больше работы.Термины - мьютекс и условная переменная - являются стандартными терминами в потоке POSIX, которые использует Linux, поэтому их следует использовать при объяснении конкретных библиотек, которые вас интересуют. В общем, рабочий поток ждет, пока основной поток чтения / созданияпередает сигнал пробуждения, указывающий, что другой объект готов к обработке.Вы можете захотеть иметь счетчик с индексом последнего полностью созданного, готового к обработке объекта, чтобы рабочий поток мог вести подсчет обработанных объектов и перемещаться по готовым, прежде чем снова проверять переменную условия.