从多个线程访问类对象

时间:2019-06-27 14:15:09

标签: c++ multithreading

假设我有一些类似于下面的容器类:

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 */ } );

由于这样的设计,会不会有所放缓?可以以某种方式加快这部分的速度吗?

1 个答案:

答案 0 :(得分:2)

由于std::vector的{​​{1}}始终位于堆上,因此您无法在其中忽略访问。唯一更快的方法是将元素保留在两个线程的堆栈上(线程具有单独的堆栈,但共享堆空间),但这在这里是不可能的。因此,除非您共享整个实现并通过更改方法,否则我认为您的情况不会有任何优化。

不过,我建议不要这样做。那将属于CodeReview,而不是StackOverflow。

最后,我想提一下线程安全性-我在这里看不到任何比赛,并且我相信您已特别确保该示例不会暗示您可能会遇到任何比赛(仅显示对阅读的访问权限,而不是共享资源),但是检查它们仍然是一个好主意。如果您仅读取内容,则不会发生数据争用。