Garantiert Standard C ++ 11, dass std :: async (std :: launch :: async, func) func in einem separaten Thread startet?

8

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?

    
Alex 02.02.2017, 14:31
quelle

1 Antwort

5

Die zwei wichtigsten Aussagen sind:

  

wie in einem neuen Thread der Ausführung, dargestellt durch ein thread -Objekt

     

Das 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.

    
Nicol Bolas 02.02.2017, 16:29
quelle