Wann sollte ich std :: async mit sync als Richtlinie verwenden?

9

std :: async hat eine Überladung, die eine std :: start-Richtlinie als erstes Argument annimmt. Wann sollte ich diese Überladung verwenden? Was sind die verschiedenen verfügbaren Richtlinien? (Ich denke, Sync und Async sind die beiden Optionen). Wann sollte ich die Synchronisierungsrichtlinie verwenden? Wie unterscheidet sich das von der direkten Ausführung?

    
balki 11.02.2012, 11:23
quelle

1 Antwort

5

Zusammenfassung von der sehr hilfreiche Artikel dass Jagannath sich mit verband und Kommentare zu den möglichen Anwendungen abgab.

Es gibt drei Start-Richtlinien:

  • any : Die Bibliothek wählt aus, ob ein Thread erzeugt werden soll oder nicht
  • async : Sie bitten explizit um die Erstellung eines Threads
  • deferred : Sie fragen explizit nach einem Thread nicht , der erzeugt werden soll

Daher ist die deferred -Richtlinie eine Möglichkeit, eine deterministische Lazy Evaluation zu erhalten (auch bekannt als Call by Need). Angenommen, Sie haben Folgendes:

%Vor%

Wenn nun der Wert dieser Ganzzahl lang ist (z. B. kann ein Netzwerk-Roundtrip aufgerufen werden), ist es in allen Fällen, in denen dies nicht erforderlich ist, ziemlich verschwenderisch ... und jetzt haben wir das Werkzeug dazu!

%Vor%

Beachten Sie, dass dies subtil anders ist als ein std::function<int()> (und ein Closure) verwendet wird, weil die Berechnung ein für allemal durchgeführt wird , um sicherzustellen, dass nachfolgende Aufrufe an bekomme immer das gleiche Ergebnis zurück.

Der Unterschied zu den anderen Richtlinien kann auch darin ausgedrückt werden, ob die Operation ausgeführt wird , wenn Sie den Wert nicht benötigen.

  • any : könnte in einem anderen Thread (proaktiv) oder gar nicht ausgeführt werden
  • async : wird für einen anderen Thread ausgeführt
  • deferred : Wird nicht ausgeführt

Daher bietet deferred eine bessere Kontrolle, was wichtig ist, wenn der Aufruf einen Nebeneffekt hat.

    
Matthieu M. 11.02.2012, 12:48
quelle

Tags und Links