Есть n количество заданий в очереди, каждое из которых исполняется в отдельном потоке. Нужно сделать так, что бы одновременно исполнялось только 2 потока. Например, два потока, один из них завершился, нужно запустить из main ещё один поток.
Если поток присоединенный, то в main можно его подождать с помощью thread join, если не присоединенный - выставляйте в потоке перед самым завершением какой-нибудь флаг означающий завершение потока. В main проверяете флаг.
Но "технологичнее" сделать так, что когда поток выполнил одно задание, он снова полез в очередь и взял оттуда другое задание. Если заданий нет, то пусть ждет. В этом вам помогут примитивы синхронизации типа мьютексов и т.п.