2010-12-04 9 views
1

Ich verwende derzeit Threading-Bausteine ​​zum Starten meiner neuesten Anwendung mit dem Task-Scheduler.Beenden der TBB-Anwendung (Task-Scheduler)

Wenn eine meiner Aufgaben trifft auf einen Grund, das Programm zu beenden:

1.) Wie kann ich sagen, alle anderen Aufgaben zurück?

2.) Wie kann ich im Hauptthread überprüfen, dass alle anderen Aufgaben zurückgegeben wurden, damit ich die Anwendung sicher beenden kann?

Danke!

Antwort

1

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.