我不确定这是否是VS 2010问题,或者我完全误解了一些问题。我正在通过lambda函数创建一个boost函数,该函数需要修改一个局部变量:
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。:上面的代码是类
的一部分答案 0 :(得分:3)
看起来你从类方法执行你的线程 - 你在lambda捕获列表中提供this
。这也意味着oCurrTime
是局部变量,所以如果你通过引用捕获它:你使用&
,那么当你的线程执行oCurrTime
时,将从堆栈中删除它,因为已经定义了它的范围结束。
解决方案是按值传递oCurrTime
(如果可能,则删除&
),或者在方法结束之前加入您的线程 - 如果可能的话。您还可以将oCurrTime
设为类变量。
答案 1 :(得分:0)
当您通过引用[&oCurrTime]
捕获它时如果oCurrTime
超出范围,您将获得dangling reference。
一种解决方案可能是按价值捕获。