Warum erzeugt boost :: futureT :: then () einen neuen Thread?

8

Beim Anhängen einer Fortsetzung an boost::future wird die Fortsetzung in einem neuen Thread ausgeführt:

%Vor%

Dieser Ausschnitt gibt Folgendes aus:

%Vor%

Warum darf .then() das, und, was noch wichtiger ist, gibt es eine Möglichkeit, dieses Verhalten anzupassen? Hat sich future s von promise / packaged_task / async anders verhalten?

    
marton78 08.04.2014, 10:42
quelle

2 Antworten

3

Es ist bereits in @ikh Antwort erwähnt. Aber um es klarer zu machen, hier ist die direkte Antwort auf die OP-Frage.

Es ist anpassbar, ob boost::future Fortsetzung sollte in einem neuen Thread oder im rufenden Thread ausgeführt werden.

Der Richtlinienparameter

boost::launch gibt an, wie die Fortsetzung ausgeführt werden soll. Siehe hier: Enumeration Start

%Vor%
  

Eine Zukunft durch async(launch::deferred, ...) oder ::then(launch::deferred, ...) geschaffen hat eine Startrichtlinie zugeordnet launch::deferred .

Versuchen Sie also Folgendes auszuführen:

%Vor%

Das sollte die Fortsetzung in demselben Thread ausführen.
Getestet mit Boost 1.61 + Visual Studio 2015 auf Windows-Plattform.

    
Alexander Stepaniuk 10.02.2017, 10:55
quelle
-2

Es ist sinnvoll, einen neuen Thread zu erstellen. Schau dir diesen Code an:

%Vor%

Ohne einen neuen Thread zu erzeugen, müssen wir auf SomeVeryVeryVeryLongLongLongLongTask() at f.then(... warten.

Wenn Sie bestimmte Beweise sehen wollen? In Referenz ,

  • Wenn das übergeordnete Element mit dem Versprechen & lt; & lt; oder mit einer packaged_task & lt; & gt; (hat keine zugehörige Start-Richtlinie), die Fortsetzung verhält sich genauso wie die dritte Überladung mit einem Richtlinienargument von launch :: async | launch :: deferred und das selbe Argument für func.

Wie Sie wissen, wissen wir bei Verwendung von launch::async | launch::deferred nicht, ob ein neuer Thread erzeugt oder verzögert wird. Aber meistens wird ein neuer Thread erzeugt, richtig?

PS. Äh? Hinweis sagen "... versprechen & lt; & lt; ...". Vielleicht ist es ein Tipp von promise<> & gt; o & lt;

PS2. Siehe @ sehes Antworten. Streng genommen hat er recht.

    
ikh 08.04.2014 11:17
quelle

Tags und Links