C++ and Beyond 2012 カンファレンスでの Concurrency に関するHerb Sutter の講演を見ていましたconcurrent<T>
。
concurrent_queue
彼の実装はかなり単純です ( 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
ますか? 私の理解では、それらが値によってキャプチャされた場合、それらはスレッドにコピーされるため、キューが更新されたときにワーカースレッドは更新を受信しませんか?
クラスメンバー変数に関してラムダキャプチャがどのように機能するかを誤解していませんか? ビデオへのコメントやトーク中に誰も何も言わなかったので、私の理解が間違っていると思います。