Blockierte Destruktoren in asynchronen Futures
Wenn ein Future von std::async zurückgegeben wird, wird sein Destruktor implizit blockierend, was zum Aufruf führt Thread pausiert. Obwohl dieses Verhalten überraschend erscheinen mag, ist es aus Sicherheits- und Korrektheitsgründen beabsichtigt.
Gründe für das Blockieren von Destruktoren
Wie von Hans Boehm im Whitepaper „N3679: Async( ) Zukünftige Destruktoren müssen warten“, warten von async() zurückgegebene Futures darauf, dass ihr zugeordneter gemeinsamer Status in ihren Destruktoren bereit wird. Dies verhindert ein Szenario, in dem der zugehörige Thread weiterläuft, ohne dass auf seine Fertigstellung gewartet werden kann, sobald die Zukunft zerstört ist. Ohne zusätzliche Maßnahmen könnte ein solcher „außer Kontrolle geratener“ Thread über die Lebensdauer seiner abhängigen Objekte hinausgehen und möglicherweise einen Thread-übergreifenden „Speicherzerfall“ und Sicherheitslücken verursachen.
Beispiel
Bedenken Sie dieses Code-Snippet:
std::future<int> future = std::async(std::launch::async, run_async_task);
Wenn der Destruktor des Futures nicht blockiert, wird der Der Thread, der run_async_task ausführt, könnte auch nach der Zerstörung der Zukunft weiterlaufen. Wenn dieser Thread auf bereits zerstörte Objekte zugreift, tritt ein Laufzeitfehler auf.
Alternativer Ansatz
Um blockierendes Verhalten zu vermeiden, rufen Sie explizit Future.get() auf. oder „future.wait()“, bevor die Zukunft zerstört wird. Dadurch wird sichergestellt, dass die damit verbundene Aufgabe abgeschlossen ist und nicht mehr von der zerstörten Zukunft abhängt.
Aktualisierung
Michael Wongs „Reisebericht“ nach dem C-Standard-Treffen im September 2013 bietet eine aktualisierte Perspektive zu diesem Thema. Obwohl es erhebliche Diskussionen gab, wurden keine Änderungen am Blockierungsverhalten von std::future-Destruktoren vorgenommen. Darüber hinaus wurde ein Vorschlag, die Verwendung von Async abzulehnen, letztendlich abgelehnt.
Das obige ist der detaillierte Inhalt vonWarum haben von std::async() zurückgegebene Futures blockierende Destruktoren?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!