假设我有一些类似于下面的容器类:
class Container {
public:
int const & operator[] (int n) const {
return data[n];
}
private:
std::vector<int> data;
}
我需要使用重载运算符[]
并通过引用将此类的对象传递给lambda捕获,以从多个线程访问其元素:
Container store;
std::thread t_1([&store]() { /* do something here and read from store */ } );
std::thread t_2([&store]() { /* do something here and read from store */ } );
这样的设计会不会减慢速度?有可能以某种方式加速这部分吗?
由于std::vector
的data()
堆上谎言而已,你不能省略访问那里。唯一更快的方法是将元素保留在两个线程的堆栈中(线程具有单独的堆栈,但共享堆空间),但这在这里是不可能的。因此,我认为您的情况不会有任何优化,除非您共享整个实现,并且通过更改方法,可能会提出性能更高的实现。
不过,我建议不要这样做。那将属于CodeReview,而不是StackOverflow。
最后,我想提一提的线程安全性-我看不出有任何的比赛在这里,我相信你明确提出确保例子不暗示,可能遇到的(仅显示获得读,而不是写来共享资源),但是检查它们仍然是一个好主意。如果您只读取内容,则不会发生数据争用。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句