Создаём общую очередь задач (потокобезопасную, блокирующую/неблокирующую, зависит от шансов коллизий)
Запускаем сколько нам нужно потоков, которые в цикле берут себе задачу из очереди, обрабатывают её и кладут куда нужно результат (лучше — вызывают коллбек у задачи, который сам решит, что делать с результатом)