我正在观看Herb Sutter在C++和Beyond 2012关于Concurrency的会议上的演讲,他谈到创建一个非阻塞的包装类,他称之为concurrent<T>
C++ 11函数.
他的实现相当简单(除了需要concurrent_queue
像微软的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); } ); }
};
Run Code Online (Sandbox Code Playgroud)
这看起来很简单,但是,我很困惑为什么他已经捕获了成员变量done
和q
值而不是通过引用?我的理解是,如果它们被值捕获,那么它们将被复制到线程中,因此当队列更新时,工作线程将不会收到更新?
我是否误解了lambda捕获如何处理类成员变量?没有人在视频的评论或谈话中说什么,所以我假设我的理解是错误的,在这种情况下有人可以澄清吗?
归档时间: |
|
查看次数: |
5741 次 |
最近记录: |