#c #callback
Вопрос:
В моей программе у меня есть глобальное статическое значение, подобное этому: static bool done=false
который принимается обратным вызовом, как это:
Library::CallbackType callback(boolamp; isDone, par1typeamp; par1,....){
return [amp;isDone,amp;par1,...](par0type par0){
if(conditionTrue){
doSomething();
} else {
thread([isDone,par1]()mutable{
cleanUp();
isDone=true;
}).detach():
}
}
}
и проблема в том, когда я вызываю код:
library->doCallback(callback(done,p1,...));
его код в целом работает, за исключением того, что значение done
не меняется, как я намереваюсь.
Итак, что я сделал не так?
Ответ №1:
Когда вы создаете свой поток, вы фиксируете isDone
значение — то есть код в лямбде работает над копией. mutable
Ключевое слово этого не меняет, оно просто позволяет вам изменить копию.
Решение состоит в том, чтобы захватить по ссылке (а затем вы можете отбросить mutable
):
thread([amp;isDone,par1](){...
Ответ №2:
thread([isDone,par1]()mutable{
Этот поток захватывается isDone
по значению. Это означает, что, когда он установит isDone
true
значение, он установит только свою собственную копию оригинала isDone
true
.
Этот поток также должен захватить его по ссылке. И, если это единственная причина, по которой это изменяемая лямбда, mutable
то она тоже может исчезнуть.