如何在 lambdas 中修改值作为参数?
How to modify value as parameters in lambdas?
在我的程序中,我有一个这样的全局静态值:
static bool done=false
通过这样的回调获取:
Library::CallbackType callback(bool& isDone, par1type& par1,....){
return [&isDone,&par1,...](par0type par0){
if(conditionTrue){
doSomething();
} else {
thread([isDone,par1]()mutable{
cleanUp();
isDone=true;
}).detach():
}
}
}
问题是当我调用代码时:
library->doCallback(callback(done,p1,...));
除了 done
的值没有像我预期的那样改变之外,它的代码通常可以正常工作。
那么,我错了什么?
thread([isDone,par1]()mutable{
此线程正在按值捕获 isDone
。这意味着当它将 isDone
设置为 true
时,它只会将原始 isDone
的副本设置为 true
.
本线程也需要通过引用捕获它。而且,如果这是可变 lambda 的唯一原因,那么 mutable
也可以消失。
创建线程时,您正在按值捕获 isDone
- 即 lambda 中的代码正在处理副本。 mutable
关键字不会改变这一点,它只会让您更改副本。
解决方法是通过引用捕获(然后你可以删除mutable
):
thread([&isDone,par1](){...
在我的程序中,我有一个这样的全局静态值:
static bool done=false
通过这样的回调获取:
Library::CallbackType callback(bool& isDone, par1type& par1,....){
return [&isDone,&par1,...](par0type par0){
if(conditionTrue){
doSomething();
} else {
thread([isDone,par1]()mutable{
cleanUp();
isDone=true;
}).detach():
}
}
}
问题是当我调用代码时:
library->doCallback(callback(done,p1,...));
除了 done
的值没有像我预期的那样改变之外,它的代码通常可以正常工作。
那么,我错了什么?
thread([isDone,par1]()mutable{
此线程正在按值捕获 isDone
。这意味着当它将 isDone
设置为 true
时,它只会将原始 isDone
的副本设置为 true
.
本线程也需要通过引用捕获它。而且,如果这是可变 lambda 的唯一原因,那么 mutable
也可以消失。
创建线程时,您正在按值捕获 isDone
- 即 lambda 中的代码正在处理副本。 mutable
关键字不会改变这一点,它只会让您更改副本。
解决方法是通过引用捕获(然后你可以删除mutable
):
thread([&isDone,par1](){...