2016-10-17 3 views
0

Wenn ich ein std :: async-Objekt in einer Klasse erstelle, wie lange läuft der entsprechende Thread? Bis der Destruktor der enthaltenden Klasse (Bar) aufgerufen wird?Wie lange läuft std :: async?

class Bar { 

public: 

Bar() { 
    handle = std::async(
       std::launch::async, 
       &Bar:foo, this); 
} 

... 

void Foo() { 
    while (true) {//do stuff//} 

} 

private: 
    std::future<void> handle; 

}; 

EDIT:

Wie lange dauert der Fadenlauf in dem folgenden Beispiel:

class Bar { 

public: 

Bar() : thread(&Bar:foo, this) { 
} 

... 

void Foo() { 
    while (true) {//do stuff//} 

} 

private: 
    std::thread thread; 

}; 

Antwort

2

Der asynchrone Betrieb läuft, bis die Funktion zurückkehrt. Wenn Sie eine Endlosschleife haben, wird sie für immer ausgeführt. Es gibt wirklich keine sichere Möglichkeit, eine asynchrone Operation abzubrechen. Sie müssen Thread-Kommunikation verwenden, um es zu beenden.

Wenn Sie die damit verbundenen Zukunft zerstören, wird es blockiert, bis der Vorgang abgeschlossen ist.

Der Thread, der die Operation unterstützt, wird möglicherweise darüber hinaus ausgeführt, wenn die Implementierung einen Threadpool verwendet, aber Sie sollten sich darüber keine Gedanken machen.

+0

Danke, sehr aufschlussreich. Verstehe ich Sie richtig, dass für periodische Aufgaben (wie Aufräumen) als Funktion Foo in meinem Beispiel std :: threads anstelle von std :: async verwendet werden sollte? – user695652

+0

Beachten Sie, dass ein Compiler gemäß dem C++ - Standard einen Thread beenden oder optimieren kann, der unbegrenzt ausgeführt wird. – rubenvb

Verwandte Themen