Я смотрел беседу Herb Sutter на конференции С++ и Beyond 2012 на Concurrency, и он рассказывает о создании неблокирующего класса-оболочки, который он называет concurrent<T>
, с функциями С++ 11.
Его реализация довольно проста (кроме необходимости , например, того, что существует в Microsoft PPL):
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 захватывает работу в отношении переменных класса? Никто не сказал ничего в комментариях к видео или во время разговора, поэтому я предполагаю, что мое понимание ошибочно, и в этом случае кто-то может прояснить?