Capturas de Lambda e variáveis de membro
eu estava olhandoA palestra de Herb Sutter na conferência C ++ e Beyond 2012 sobre Concurrency e ele fala sobre a criação de uma classe wrapper sem bloqueio, que ele chamaconcurrent<T>
, com funções C ++ 11.
Sua implementação é bastante simples (além de precisar deconcurrent_queue
como o que existe no PPL da Microsoft):
template <class T>
class concurrent {
private:
mutable T t;
mutable concurrent_queue<std::function<void()>> q;
bool done = false;
std::thread thread;
public:
concurrent( T t_ = T{} ) : t{t_}, thread{ [=]{ while( !done ) q.pop()(); }} {}
~concurrent() { q.push( [=]{ done = true; } ); thread.join(); }
template <typename F>
void operator()( F f ) const { q.push( [=]{ f(t); } ); }
};
Isso parece bastante simples, no entanto, estou confuso sobre por que ele capturou as variáveis de membrodone
eq
por valor em vez de por referência? Meu entendimento é que, se eles forem capturados por valor, eles serão copiados para o encadeamento e, assim, quando a fila for atualizada, o encadeamento de trabalho não receberá as atualizações?
Eu entendi mal como o lambda captura o trabalho com relação às variáveis dos membros da classe? Ninguém disse nada nos comentários para o vídeo ou durante a palestra, então estou supondo que o meu entendimento é defeituoso, caso em que alguém poderia esclarecer?