我不确定这是 VS 2010 的问题还是我完全误解了某些东西。我正在通过需要修改局部变量的 lambda 函数创建一个增强线程:
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 循环(计算与某个特定时间的时差)无用。
非常感谢您的帮助。
P.S.: 上面的代码是一个类的一个函数的一部分
最佳答案
看起来您从类方法执行线程 - 您在 lambda 捕获列表中提供了 this
。这也意味着 oCurrTime
是局部变量,因此如果您通过引用捕获它:您使用 &
,那么当您的线程执行时 oCurrTime
将被删除来自堆栈,因为定义时的作用域已经结束。
解决方案是在可能的情况下按值传递 oCurrTime
(删除 &
),或者在您的方法结束之前加入您的线程 - 如果可能的话。您还可以将 oCurrTime
设为类变量。
关于C++ Lambda 捕获弄乱了局部变量值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36641257/