2013-06-19 2 views
20

Я наблюдал за Herb Sutter's talk на конференции C++ и Beyond 2012 по параллелизму, и он рассказывает о создании неблокирующего класса-оболочки, который он называет concurrent<T>, с функциями C++ 11.Лямбда-захваты и переменные-члены

Его реализация довольно проста (в стороне от нуждающихся в concurrent_queue таких, как то, что существует в госзакупках от 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); }); } 

}; 

Это кажется достаточно простым, однако, я запутался, почему он захватил переменные-члены done и q по значению вместо ссылки? Я понимаю, что если они будут захвачены по значению, они будут скопированы в поток и, таким образом, когда очередь будет обновлена, рабочий поток не получит обновления?

Я не понял, как lambda захватывает работу в отношении переменных класса? Никто не сказал ничего в комментариях к видео или во время разговора, поэтому я предполагаю, что мое понимание ошибочно, и в этом случае кто-то может прояснить ситуацию?

ответ

37

Членские переменные могут никогда быть захвачены по значению. То, что захватывается по значению, - это неявный указатель , используемый для доступа к ним. Поэтому он захватывает указатель по значению, что означает, что он захватывает этот объект (и его элементы) на с ссылкой.

+0

О, да, это имеет смысл, спасибо! –

Смежные вопросы