Ich bin durch etwas über C++ 11 std::future
verwirrt. Ich möchte die Arbeitslast dynamisch ausgleichen. Wenn also einige Prozessoren inaktiv sind, erstelle ich std::future
mit std::async
, um die verbleibenden Daten zu teilen. Es funktioniert gut.Wie kündige ich ein std :: future?
std::future<int> f[MAX_CHILD];
for (each data item){
if (found_idle_processor)
f[i] = std::async(...);
process();
}
// At last, query the result of f.
for (each future)
hold = f[i].get();
Aber manchmal, wenn einige spezielle Datenelemente gefunden wurden, alle anderen Daten werden verworfen und das Programm sollte das Endergebnis sofort geben, dann wird eine andere Aufgabe gestartet werden.
std::future<int> f[MAX_CHILD];
for (each data item){
if (found_idle_processor)
f[i] = std::async(...);
process();
if (found_special_item)
return final_result;
}
// At last, query the result of each f.
for (each future)
hold = f[i].get();
Aber die erstellt f
sind aus meiner Kontrolle, laufen sie immer noch nach der Rückkehr? Wie kann ich sie beenden, um die verwendete CPU-Zeit freizugeben?
Es ist einfach: Sie können nicht. In der Tat gibt es keine Möglichkeit, Futures * oder * Threads im Standard zu löschen. –
Ich bin auf Windows-Plattform ausgerichtet, keine Portabilität ist erforderlich. Plattformabhängige Methoden wie 'TerminateThread (thread-> nativeHandle(), 0)' sind ebenfalls akzeptabel. Aber ich weiß auch nicht, wie ich den nativen Griff bekommen soll. – Aean
Während Sie das native Handle von einem 'std :: thread 'erhalten können, ist es nicht für' std :: future' verfügbar. Wahrscheinlich, weil Futures nicht in einem Thread laufen müssen. –