Ist es möglich zu überprüfen, ob a std::future
fertig ist oder nicht? Soweit ich das beurteilen kann, besteht der einzige Weg darin, wait_for
mit einer Dauer von Null anzurufen und zu überprüfen, ob der Status lautet ready
oder nicht, aber gibt es einen besseren Weg?
c++
multithreading
c++11
future
David Brown
quelle
quelle
valid
nur geprüft, ob die Zukunft einen gemeinsamen Status hat (dh sie kehrt zurück,true
bisget
sie für die Zukunft aufgerufen wird).get
also aufgerufen wurden und den gespeicherten Wert zurückgeben, möchten Sie trotzdemtrue
? (Ich bin nicht sicher, warum dies nützlich wäre, da Sie den Wert nur einmal erhalten können.)QFuture::isFinished
Grunde.Antworten:
Sie haben Recht, und abgesehen davon, dass Sie
wait_until
mit einer Zeit in der Vergangenheit anrufen (was gleichwertig ist), gibt es keinen besseren Weg.Sie können jederzeit einen kleinen Wrapper schreiben, wenn Sie eine bequemere Syntax wünschen:
template<typename R> bool is_ready(std::future<R> const& f) { return f.wait_for(std::chrono::seconds(0)) == std::future_status::ready; }
Hinweis: Wenn die Funktion zurückgestellt wird, wird dies niemals true zurückgeben. Daher ist es wahrscheinlich besser,
wait_for
direkt zu prüfen, ob Sie die zurückgestellte Aufgabe nach Ablauf einer bestimmten Zeit oder bei geringer Systemlast synchron ausführen möchten.quelle
for(int i = 0; i < 1000; i++) f.wait_for(chrono::seconds(0));
dauert 43 ms Wanduhrzeit.Für std :: future ist eine is_ready-Memberfunktion in Arbeit . In der Zwischenzeit hat die VC-Implementierung ein _Is_ready () -Mitglied.
quelle
Meine erste Wette wäre zu nennen
wait_for
mit einem 0 Dauer, und überprüfen Sie das Ergebnis - Code, der eine der folgenden sein kannfuture_status::ready
,future_status::deferred
oderfuture_status::timeout
.In cppreference behaupten sie, dass
valid()
geprüft wird, ob das Ergebnis verfügbar ist , aber der Standard besagt, dass zurückgegebenvalid()
wird,true
wenn*this
auf einen gemeinsam genutzten Zustand verwiesen wird , unabhängig davon, ob dieser Zustand bereit ist oder nicht.quelle