2014-03-26 3 views
6

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?

+5

Es ist einfach: Sie können nicht. In der Tat gibt es keine Möglichkeit, Futures * oder * Threads im Standard zu löschen. –

+0

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

+0

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. –

Antwort

8

Der C++ - Standard bietet keine Möglichkeit, eine Zukunft abzubrechen oder einen Thread zu stoppen. Dafür gibt es einen Grund.

Es gibt keine Möglichkeit zu wissen, ob ein Thread zu einem bestimmten Zeitpunkt sicher gestoppt werden kann. Der Thread kann Ressourcen erworben haben, die finalisiert werden sollten. Nur der laufende Thread selbst weiß, wann es sicher ist, zu stoppen.

Auch wenn die zugrundeliegende Low-Level-API einen Aufruf zum beliebigen Töten eines Threads bietet, ist dies aufgrund der oben genannten Umstände definitiv kein guter Weg.

Herkömmliche Lösung für dieses Problem signalisiert den Thread und löscht es von innen. Eine triviale Implementierung kann auf einem einzelnen atomaren Flag basieren.

+0

Danke für Ihre Antwort. AFAIK 'Pthread' stellte eine Reihe von Methoden' Pthread_setcanceltype' 'pthread_testcancel' und' pthread_cancel' zur Verfügung, die einen Thread sicher und einfach beenden konnten. So traurig zu wissen, dass C++ keine solchen Entsprechungen hat. – Aean

+0

@Aean: Ja, sie können den Thread beenden. Im Allgemeinen gibt es jedoch keine Möglichkeit, dies ohne mögliche Nebenwirkungen (Image-Beendigung eines Netzwerk-Server-Threads) von außen sicher durchzuführen. –

Verwandte Themen