20

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ますか? 私の理解では、それらが値によってキャプチャされた場合、それらはスレッドにコピーされるため、キューが更新されたときにワーカースレッドは更新を受信しませんか?

クラスメンバー変数に関してラムダキャプチャがどのように機能するかを誤解していませんか? ビデオへのコメントやトーク中に誰も何も言わなかったので、私の理解が間違っていると思います。

4

1 に答える 1

37

メンバー変数を値でキャプチャすることはできません。値によってキャプチャされているのは、thisそれらにアクセスするために使用される暗黙のポインターです。したがって、値によってポインターをキャプチャしています。つまり、このオブジェクト (およびそのメンバー) を参照によってキャプチャします。

于 2013-06-19T17:55:35.323 に答える