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!