2016-04-15 15 views
4

Ich bin mir nicht sicher, ob dies ein VS 2010 Problem ist oder ich etwas komplett falsch verstehe. Ich bin ein Schub Faden über eine Lambda-Funktion zu schaffen, die eine lokale Variable ändern muss:C++ Lambda-Aufnahme, die lokalen Variablenwert durcheinander bringt

auto oCurrTime(boost::posix_time::microsec_clock::universal_time()); 
    auto spRequestSequenceThread = make_unique<boost::thread>([&oCurrTime, this]() 
    { 
     while (!checkAgainstSpecificTime(oCurrTime)) 
     { 
      ... 
     } 
     : 
     : 
    } 

Vor dem Faden zu schaffen, ist oCurrTime etwas wie 2864273654234872634, aber im Thread wird dieser Wert verloren und oCurrTime sofort ist so etwas wie 487465847564875465, macht das Rendern der while-Schleife (wo eine Zeitdifferenz zu einer bestimmten Zeit ausgewertet wird) unbrauchbar.

Vielen Dank für Hilfe.

P. S .: Der obige Code Teil einer Funktion einer Klasse

+2

Was macht Ihr Haupt-Thread nach dem Start dieses Lambda-Threads? Sind Sie sicher, dass 'oCurrTime' nicht existiert und/oder gleichzeitig vom Haupt-Thread aufgerufen wird? –

+0

Die gleichzeitige Nutzung ist definitiv nicht der Fall. Aber ich denke, du hast Recht mit der Existenz Dings, da die Funktionen wahrscheinlich zurückkommen, bevor die Threads enden. Ich habe das nicht berücksichtigt und werde das sofort überprüfen ... – gilgamash

Antwort

3

Es ist aussehen wie Sie Ihren Faden von Klassenmethode ausführen - Sie bieten this in Lambda-Capture-Liste. Dies bedeutet auch oCurrTime ist lokale Variable, also wenn Sie es als Referenz erfassen: Sie verwenden &, dann, wenn Ihr Thread ausgeführt wird oCurrTime wird aus dem Stapel entfernt, da der Umfang, wenn es definiert wurde bereits beendet.

Die Lösung besteht darin, oCurrTime nach Wert (&) zu übergeben, wenn es möglich ist, oder zu Ihrem Thread beizutreten, bevor Ihre Methode endet - auch wenn das möglich ist. Sie könnten auch oCurrTime eine Klassenvariable machen.

+0

Ja, wie in der Antwort oben, ich denke, es ist ein Problem außerhalb des Geltungsbereichs. Ich werde versuchen, es zu einem Mitglied var ... – gilgamash

+0

@gilgamash können Sie durch Wert erfassen –

+0

Ja, ich könnte das tun, aber der Wert wird innerhalb des Threads geändert (die ich nicht durch den Code oben klar gemacht habe), so dass dies ist keine Option für diesen speziellen Fall. – gilgamash

0

Wie Sie es von Referenz [&oCurrTime]
Wenn oCurrTime den Gültigkeitsbereich verlässt haben Sie eine dangling reference sind zu erfassen.

Eine Lösung könnte sein, nach Wert zu erfassen.