Gewährleistet Standard C ++ 11, dass std::async(std::launch::async, func)
die Funktion in einem separaten Thread startet?
Arbeitsentwurf, Standard für Programmiersprache C ++ 2016-07-12: Ссылка
1. Auf der einen Seite sagt C ++ 11-Standard, dass, wenn der Thread nicht erstellt werden kann, ein Fehler vorliegt. Dies gewährleistet die Erstellung eines neuen Threads (in Abwesenheit von Fehlern).
§ 30.6.8
6
Auslöser: system_error if policy == launch :: async und der Implementierung ist nicht in der Lage, einen neuen Thread zu starten.
7 Fehlerbedingungen:
(7.1) - resource_unavailable_try_again - if policy == launch :: async und das System ist nicht in der Lage, einen neuen Thread zu starten .
Und die Dokumentation sagt: Ссылка
std :: launch :: async ein neuer Thread wird gestartet, um die Aufgabe auszuführen asynchron
2. Auf der anderen Seite steht geschrieben, dass der Thread potenziell erstellt werden kann. Diese, ist nicht notwendig, dass Thread erstellt werden sollte.
§ 30.6.8
1 Die Funktionsvorlage async bietet einen Mechanismus zum Starten eines Funktion möglicherweise in einem neuen Thread und liefert das Ergebnis der Funktion in einem zukünftigen Objekt, mit dem es einen gemeinsamen Status teilt.
Und hier geschrieben als ob in einem neuen Thread , bedeutet es nicht notwendig in neuen separaten Thread?
§ 30.6.8
(3.1)
- wenn Politik & amp; launch :: async ist nicht Null - ruft INVOKE auf (DECAY_COPY (std :: vorwärts (f)), DECAY_COPY (std :: vorwärts (args)) ...) (20.14.2, 30.3.1.2) wie in einem neuen Thread der Ausführung repräsentiert durch ein Thread-Objekt mit den Aufrufen von DECAY_COPY () in dem Thread bewertet, der Async aufgerufen. Jeder Rückgabewert wird gespeichert als Ergebnis im gemeinsam genutzten Zustand. Jede Ausnahme, die von der Ausführung von INVOKE (DECAY_COPY (Std :: Vorwärts (f)), DECAY_COPY (std :: forward (args)) ...) wird als Ausnahmeergebnis in gespeichert der gemeinsame Status. Das Thread-Objekt wird im gemeinsamen Status gespeichert und beeinflusst das Verhalten von asynchronen Rückgabeobjekten, auf die verwiesen wird dieser Zustand.
Wenn% ce_de% verwendet wird, garantiert dann C ++ 11, dass std::async(std::launch::async, func)
in einem separaten Thread ausgeführt wird oder in demselben Thread ausgeführt werden kann, der async aufgerufen hat?
Die zwei wichtigsten Aussagen sind:
wie in einem neuen Thread der Ausführung, dargestellt durch ein
thread
-ObjektDas
thread
-Objekt wird im gemeinsam genutzten Zustand gespeichert und beeinflusst das Verhalten aller asynchronen Rückgabeobjekte, die auf diesen Zustand verweisen.
"Als ob" bedeutet, dass es sich genau so verhalten muss, als ob es ein Objekt std::thread
für diese Funktion erstellt hätte. Das bedeutet, dass alle Nebeneffekte der Erstellung eines std::thread
ebenfalls auftreten müssen.
Wenn Sie launch::async
mit launch::deferred
kombinieren, entscheidet die Implementierung, ob ein neuer Thread gestartet oder auf einen vorhandenen Thread verschoben werden soll. Es ist also nur launch::async
alleine, das einen neuen Thread benötigt.
Tags und Links c++ multithreading c++11 asynchronous c++14