Я наблюдал за 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 захватывает работу в отношении переменных класса? Никто не сказал ничего в комментариях к видео или во время разговора, поэтому я предполагаю, что мое понимание ошибочно, и в этом случае кто-то может прояснить ситуацию?
О, да, это имеет смысл, спасибо! –