Warum der Block: Gründe für die blockierenden Destruktoren von Futures, zurückgegeben von std::async
Bei der Arbeit mit asynchronen Aufgaben der Destruktor von Ein von std::async zurückgegebener Future ist für sein blockierendes Verhalten bekannt, was Fragen über seine Notwendigkeit aufwirft. Um uns mit dieser Designwahl zu befassen, untersuchen wir die Bedenken und Diskussionen, die zu seiner Implementierung geführt haben.
Herb Sutters Artikel „async, ~future, and ~thread“ beleuchtet Sicherheitsüberlegungen im Zusammenhang mit dem Blockieren von Destruktoren. Ohne dieses Verhalten könnte ein mit der Zukunft verknüpfter „Run-Away“-Thread weiter ausgeführt werden, nachdem sein zugeordneter Status zerstört wurde. Dieser Mangel an Kontrolle über die Aufgabenerfüllung könnte möglicherweise zu Speicherbeschädigungen oder anderen unerwarteten Problemen führen.
Hans Boehms Artikel „Async() Future Destructors Must Wait“ liefert ein konkretes Beispiel für diese Sorge. Ohne das Blockieren von Destruktoren könnten Ausnahmebehandlung oder externe Ereignisse den erwarteten Ablauf der Aufgabenausführung stören. Wie Boehm betont, könnte dies zu einer Sicherheitslücke führen, bei der ein Angreifer das Timing von Ausnahmen manipulieren könnte, um ein Versehen der Bereichswächter auszunutzen, was zum Überschreiben des Stapels und zur Prozessentführung führt.
Der blockierende Destruktor dient als Schutz davor Diese potenziellen Gefahren verhindern, dass der zugehörige Thread nach der Zerstörung des Futures weiterhin ausgeführt wird. Es ist jedoch wichtig zu beachten, dass dieses Verhalten spezifisch für Futures ist, die von std::async mit einer asynchronen Startrichtlinie zurückgegeben werden. Andere Futures, wie die von std::promise zurückgegebenen oder Futures von parallelen Algorithmen, zeigen in ihren Destruktoren nicht das gleiche Blockierungsverhalten.
Trotz der geäußerten Sicherheitsbedenken ist der blockierende Destruktor von std::async-Futures war ein Thema der laufenden Debatte im C-Standardisierungsausschuss. Vorgeschlagene Änderungen, um das Blockierungsverhalten abzuschaffen oder es nicht zum Standard für asynchrone Futures zu machen, wurden nicht angenommen.
Zusammenfassend lässt sich sagen, dass die blockierenden Destruktoren von Futures, die von std::async zurückgegeben werden, eine umstrittene Designentscheidung sind, die aus Sicherheitsbedenken resultiert . Es verhindert zwar potenzielle Probleme im Zusammenhang mit unkontrollierter Thread-Ausführung, macht aber auch die Notwendigkeit einer expliziten Verwaltung des Thread-Lebenszyklus und der Bereichswächter erforderlich, um eine ordnungsgemäße Bereinigung sicherzustellen.
Haftungsausschluss: Alle bereitgestellten Ressourcen stammen teilweise aus dem Internet. Wenn eine Verletzung Ihres Urheberrechts oder anderer Rechte und Interessen vorliegt, erläutern Sie bitte die detaillierten Gründe und legen Sie einen Nachweis des Urheberrechts oder Ihrer Rechte und Interessen vor und senden Sie ihn dann an die E-Mail-Adresse: [email protected] Wir werden die Angelegenheit so schnell wie möglich für Sie erledigen.
Copyright© 2022 湘ICP备2022001581号-3