Как изменить значение в качестве параметров в лямбдах?

#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 то она тоже может исчезнуть.