Lambda innerhalb der Schleife

7

Ich habe ein Lambda innerhalb einer for-Schleife mit dem Parameter loop variable im Lambda. Wenn ich es ausführe, erwarte ich, dass die Zahlen 0-9 ausgegeben werden. Aber da es ein Lambda ist, wird das x nicht sofort ausgewertet.

%Vor%

Ausgabe:

%Vor%

usw.

Die Lösung für andere Sprachen wäre, eine temporäre Variable zu erstellen,

%Vor%

aber das scheint nicht zu funktionieren.

Siehe Threads, die falsche Parameter erhalten

Bonus:

Auf der Suche nach einer Antwort bin ich auf diese Frage gestoßen Generalisierung von C ++ 11-Threads-Klasse für die Arbeit mit Lambda Es wird empfohlen, keinen Container zu verwenden, der die Iteratoren ungültig macht. Warum wäre das /

?     
SaulBack 17.09.2012, 00:07
quelle

3 Antworten

11

Wenn Sie das Capture angeben, können Sie zwischen der Erfassung nach Wert und der Erfassung nach Referenz wählen. Sie haben ausgewählt, dass Sie durch Referenz erfassen. Mit Referenz erfassen bedeutet, dass sich die Variable innerhalb der Lambda-Funktion auf dasselbe Objekt bezieht. Dies hat zur Folge, dass alle Änderungen an dieser Variablen gemeinsam genutzt werden und Sie außerdem sicherstellen müssen, dass das referenzierte Objekt für die gesamte Lebensdauer der Lambda-Funktion erhalten bleibt.

Sie wollten wahrscheinlich Werte erfassen. Um dies zu tun, können Sie entweder die Capture-Spezifikation ersetzen, um [=] zu werden oder [x] zu werden. Letzteres stellt sicher, dass nur auf x zugegriffen werden kann, während erstere den Zugriff auf andere Variablen ermöglichen würde.

Übrigens, ich würde nicht explizit mit lock() und unlock() empfehlen, sondern stattdessen einen der Schlosswächter verwenden. Damit würde der Körper Ihrer Schleife in etwa so aussehen:

%Vor%     
Dietmar Kühl 17.09.2012, 00:17
quelle
6

Erfassen Sie den Parameter mit value anstatt durch Referenz, wenn Sie eine Kopie erstellen möchten:

%Vor%

Dies kopiert den Wert von x zum Zeitpunkt der Erstellung des Lambda-Objekts (nicht zum Zeitpunkt des Starts des Threads).

  

Bei meiner Suche nach einer Antwort stolperte ich über diese Frage, die Klasse C ++ 11 Threads mit Lambda zu verallgemeinern, die empfiehlt, keinen Container zu verwenden, der die Iteratoren ungültig machen würde. Warum wäre das /

?

Weil es sich um eine komplett andere Implementierung handelt, die direkt die Pthreads-Bibliothek verwendet. Sie verwenden std::thread , das in C ++ funktionieren soll.

    
Nicol Bolas 17.09.2012 00:09
quelle
3

Das Problem besteht darin, dass Sie das x als Referenz erfassen. Wenn also x am Ende jeder Schleife inkrementiert wird, spiegelt sich das im Thread wider.

Sie möchten x als Wert erfassen, so dass das Lambda nur den Wert von x verwendet, wenn das Lambda erstellt wird.

%Vor%     
Lalaland 17.09.2012 00:10
quelle

Tags und Links