Der erste Teil der Frage wurde bereits beantwortet. Sie können task cancellation verwenden, um zu verhindern, dass die Aufgabe zur Ausführung geplant wird. Z.B .:
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();
}
});
In dem obigen Beispiel wird der Haupt-Thread wartet alle Aufgaben wie gewohnt zu beenden, da es synchrone Art von API ist. Aber wenn Ihre Frage impliziert, dass es Aufgaben gibt, asynchron ausgeführt wird, betrachten low-level TBB scheduler API oder auf hohe Ebene mit tbb::task_group wie:
tbb::task_group g;
g.run([]{ Do_my_work1(); });
g.run([]{ Do_my_work2(); });
...
g.cancel();
g.wait();
Und schließlich gibt blockiert Beendigung Vorschau-Funktion (Suche nach TBB_PREVIEW_WAITING_FOR_WORKERS), die helfen würde, wenn Sie nicht brauchen Warten Sie nur auf die Ausführung der Tasks, aber warten Sie auch, wenn TBB-Worker beendet werden.