На первую часть вопроса уже дан ответ, вы можете использовать отмену задачи , чтобы остановить запланированное выполнение задачи. E.g.:
tbb::parallel_for(0,100, [](int i){
for(int j = 0; j < 10000000 && !task::self().is_cancelled(); j++) {
if( must_stop )
task::self().cancel_group_execution();
else
do_my_work();
}
});
В приведенном выше примере основной поток будет ожидать завершения всех задач, как обычно, поскольку это синхронный тип API. Но если ваш вопрос подразумевает, что существуют асинхронно выполняемые задачи, рассмотрите возможность использования низкоуровневого API планировщика TBB или высокоуровневого tbb :: task_group вроде:
tbb::task_group g;
g.run([]{ Do_my_work1(); });
g.run([]{ Do_my_work2(); });
...
g.cancel();
g.wait();
И, наконец, есть функция предварительного просмотра блокировки (поиск TBB_PREVIEW_WAITING_FOR_WORKERS), которая может помочь, если вам нужно не только дождаться окончания выполнения задач, но и дождаться завершения работы работников TBB.