Heim >Backend-Entwicklung >C++ >Warum haben std::async-Futures blockierende Destruktoren?
Warum der Block: Gründe für die blockierenden Destruktoren von Futures, die von std::async zurückgegeben werden
Bei der Arbeit mit asynchronen Aufgaben ist der Destruktor von Ein von std::async zurückgegebener Future zeichnet sich durch sein blockierendes Verhalten aus, was Fragen zu seiner 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 weiterhin 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 dieses Problem. Ohne blockierende 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.
Das obige ist der detaillierte Inhalt vonWarum haben std::async-Futures blockierende Destruktoren?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!