Heim > Backend-Entwicklung > C++ > Hauptteil

Warum haben von std::async() zurückgegebene Futures blockierende Destruktoren?

DDD
Freigeben: 2024-11-20 15:43:12
Original
990 Leute haben es durchsucht

Why do Futures Returned by std::async() Have Blocking Destructors?

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);
Nach dem Login kopieren

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!

Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage