2016-04-07 10 views
0

Ich glaube, dass wir dann von einem dann nehmen können. Zum BeispielHat boost :: future dann irgendeine Begrenzung seiner Länge?

boost::future<void> f1 = boost::async(...); 
boost::future<void> f2 = f1.then(...); 
boost::future<void> f3 = f2.then(...); 
... 

Wie lange könnte diese Fortsetzungskette sein? Es ist sicher, wenn wir eine lange dann/dann/dann-Kette haben.

Vielen Dank,

+0

Wenn es für 'f1' unterstützt wird, warum würde jemand denken, dass es für' f2' usw. nicht unterstützt wird? Sind nicht alle von ihnen 'Zukunft' und somit * semantisch identisch *? – Nawaz

+0

@Nawaz Wie ich gedacht hatte, könnte es als rekursiver Aufruf implementiert werden, um alle Aufrufe zu verketten. Wenn ja, würde es Überlauf-Stacks laufen. Wenn dies nicht der Fall ist, würde es keine Einschränkungen geben. –

+1

Nein. Es ist nicht rekursiv .... und es kann nicht rekursiv sein; weil der Rückruf von 'f1' den Rückruf von' f2' nicht aufruft; es ist eher so: 'callback1' kehrt zurück, dann wird' callback2' aufgerufen, ein * nach * einem anderen, ** nicht ** ein * von * einem anderen. – Nawaz

Antwort

0

Es gibt keine Einschränkungen durch die Bibliothek. then ist eine Mitgliedsfunktion von boost::future, die eine boost::future zurückgibt. So können Sie diese bis an die Grenzen der Hardware effektiv verketten. Es ist wahrscheinlich eine gute Idee, die Logik von ihnen wartbar zu halten, indem man sie im Umfang auf die gleiche Weise einschränkt, wie Funktionen eingeschränkt werden sollten.

+0

von "die Grenzen der Hardware", meinst du # Threads? Ich hätte gedacht für einen angeketteten dann wäre ein Thread ausreichend. Ist das nicht "intern"? –

+0

Durch die Beschränkung der Hardware meine ich, dass Code Speicherplatz im Speicher belegt und diese so verkettet werden Speicher verwendet. d.h. 'myFuture.then (a) .dann (b) ... dann (...)'. –