Heim > Backend-Entwicklung > C++ > Hauptteil

Warum blockiert der von „std::async' zurückgegebene „std::future'-Destruktor?

Mary-Kate Olsen
Freigeben: 2024-11-15 14:26:02
Original
874 Leute haben es durchsucht

Why Does the `std::future` Destructor Returned by `std::async` Block?

Blockierende Natur des von std::async zurückgegebenen Destruktors std::future

Bei der Absicht, eine Aufgabe asynchron zu starten, wurde festgestellt, dass Der Destruktor eines von std::async zurückgegebenen std::future zeigt blockierendes Verhalten. Dies warf Fragen über die Gründe für diese Designentscheidung auf und darüber, ob sie im Hinblick auf Komfort und Effizienz verbessert werden könnte.

Argumente für das Blockieren des Destruktors

Eines der Hauptanliegen von Der blockierende Destruktor verhindert „außer Kontrolle geratene“ Threads. Wenn std::future zerstört wurde, ohne auf den Abschluss des zugehörigen Threads zu warten, könnte dies zu unvorhersehbarem Verhalten und potenzieller Speicherbeschädigung führen.

Wie in Hans Boehms Artikel (N3679) beschrieben, kann dieses Problem auftreten, wenn a Der Thread verarbeitet Daten, die bereits zerstört wurden. Ohne einen blockierenden Destruktor könnte der Thread möglicherweise weiterhin auf diese Daten zugreifen und diese ändern, was zu threadübergreifenden Speicherproblemen führen würde.

Alternative Ansätze

Einige haben vorgeschlagen, dass a Ein nicht blockierender Destruktor würde ausreichen, wenn die Methoden get oder wait immer aufgerufen würden, um das Ergebnis abzurufen oder auf den Abschluss zu warten. Boehm argumentiert jedoch, dass das Vertrauen auf explizite Aufrufe leicht zu übersehen sei und zu Sicherheitslücken führen könne. Außergewöhnliche Umstände, wie z. B. Ausnahmen während der Ausführung, könnten solche Aufrufe umgehen und zur Erstellung außer Kontrolle geratener Threads führen.

Aktueller Status und zukünftige Entwicklungen

Trotz laufender Diskussionen innerhalb der Laut C-Standardkomitee sind keine Änderungen für das Blockierungsverhalten von std::future-Destruktoren in C 14 geplant. Das Problem wird jedoch weiterhin geprüft und zukünftige Versionen von C werden dieses Verhalten möglicherweise beheben.

Empfehlungen für die Praxis

Um mögliche Probleme im Zusammenhang mit dem Blockieren von Destruktoren zu vermeiden, wird empfohlen, immer get aufzurufen oder zu warten, bevor ein von std::async zurückgegebenes std::future zerstört wird. Dadurch wird sichergestellt, dass der zugehörige Thread seine Ausführung abgeschlossen hat und alle erforderlichen Ressourcen freigegeben wurden.

Das obige ist der detaillierte Inhalt vonWarum blockiert der von „std::async' zurückgegebene „std::future'-Destruktor?. 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
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage