Blockieren von Destruktoren in std::async-Futures: Eine technische Erklärung
Bei der Verwendung von std::async zur asynchronen Ausführung von Aufgaben in C 11, Beim Zerstören des zurückgegebenen std::future-Objekts kann es zu einem unerwarteten Blockierungsverhalten kommen. Dieser Artikel befasst sich mit den Gründen für dieses Verhalten, seinen Auswirkungen und den laufenden Diskussionen innerhalb des C-Standardisierungsausschusses.
Der Destruktor eines von std::async zurückgegebenen std::future blockiert absichtlich, um mögliche Inkonsistenzen zu verhindern Sicherheitsbedenken. Laut den von Mitgliedern des C-Standards-Komitees veröffentlichten Papieren ist dieses Blockierungsverhalten unerlässlich, um sicherzustellen, dass der zugehörige Thread den referenzierenden std::future nicht überlebt.
Ohne dieses Blockierungsverhalten besteht die Gefahr von Erstellen von „außer Kontrolle geratenen“ Threads, die nach der Zerstörung von std::future weiter ausgeführt werden, was zu potenzieller Speicherbeschädigung oder Datenverlust führen kann. Dies kann auftreten, wenn während der Ausführung der asynchronen Aufgabe eine unerwartete Ausnahme ausgelöst wird, die dazu führt, dass alle nachfolgenden get()- oder wait()-Vorgänge auf std::future umgangen werden.
Um dieses Risiko zu mindern, wird die Der blockierende Destruktor des std::future bietet ein Sicherheitsnetz, indem er sicherstellt, dass der zugehörige Thread abgeschlossen wird, bevor das std::future-Objekt zerstört wird. Dieses Verhalten erfordert eine explizite Behandlung durch den Programmierer, der sicherstellen muss, dass alle erforderlichen get()- oder wait()-Vorgänge ausgeführt werden, bevor std::future den Gültigkeitsbereich verlässt.
Trotz der Argumente für ein Nicht- Blockierungsdestruktor hat das C-Standardkomitee beschlossen, das Blockierungsverhalten in C 14 beizubehalten. Allerdings können vorgeschlagene Änderungen in zukünftigen Revisionen des C-Standards auf der Grundlage laufender Diskussionen innerhalb der Community eingeführt werden.
Das obige ist der detaillierte Inhalt vonWarum blockiert der „std::future'-Destruktor in „std::async'?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!