2016-04-15 11 views
4

これはVS 2010の問題であるか、何かを完全に誤解しているかどうかはわかりません。スレッドを作成する前にC++ラムダキャプチャがローカル変数値を乱す

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

、oCurrTimeは2864273654234872634のようなものですが、スレッド内で、この値が失われとoCurrTimeはすぐのようなものです:私は、ローカル変数を変更する必要がラムダ関数を経由してブーストスレッドを作成しています487465847564875465、whileループ(ある特定のTimeとの時間差が評価される)をレンダリングすることは役に立たない。

ありがとうございました。

P.S:上記のコードは、あなたのスレッドは、クラスメソッドから実行するように見えクラス

+2

このラムダスレッドを起動した後、あなたのメインスレッドは何をしますか? 'oCurrTime'が存在しない、あるいはメインスレッドによって同時にアクセスされないことは確かですか? –

+0

同時使用は間違いありません。しかし、スレッドが終了する前に関数がおそらく返すので、あなたは存在の存在について正しいと思います。私はこれを考慮しなかったし、すぐにこれをチェックします... – gilgamash

答えて

3

の機能の一部である - あなたはラムダキャプチャリストにthisを提供しています。これはまた、oCurrTimeがローカル変数であることを意味します。したがって、参照によってキャプチャする場合:&を使用し、スレッドが実行されるときoCurrTimeはスコープがすでに定義されているのでスタックから削除されます。

可能であれば、oCurrTimeを値で渡します(削除する場合は&)。もし可能であれば、メソッドが終了する前にスレッドに参加してください。 oCurrTimeをクラス変数にすることもできます。

+0

上記の答えのように、私はそれが範囲外の問題だと思います。 – gilgamash

+0

@gilgamash値で取り込むことができる –

+0

はい、私はそれを行うことができますが、値はスレッド内で変更されます(これは上のコードではわかりません)。この特定の場合のオプションではありません。 – gilgamash

0

参照としてキャプチャしています[&oCurrTime]
oCurrTimeが範囲外になる場合はdangling referenceになります。

1つの解決策は、値によって取得することができます。

関連する問題