从多个线程访问类对象
Accessing class object from multiple threads
假设我有一些容器类,如下一个:
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
's data()
无论如何都位于堆上,因此您不能省略那里的访问。唯一更快的方法是将元素保留在两个线程的堆栈上(线程具有单独的堆栈,但共享堆空间(,但这不是可能的。因此,除非您分享您的整个实施并更改该方法,否则我认为您的案件没有优化,但可能会提出更多的性能实施。
我会建议不要这样做。那将属于codereview,而不是stackoverflow。
最后,我想提及线程安全 - 我在这里看不到任何比赛,我相信您明确确保该示例没有暗示您可能会遇到任何比赛(仅显示访问阅读而不是写作共享资源(,但是检查它们仍然是一个好主意。如果您正在做的只是阅读,则不会发生任何数据竞赛。
相关文章:
- 按基类对象访问派生类资源时出错
- 使用基类对象访问派生的仅类方法
- 从 const 对象访问非 const 方法
- 如何在C++中使用类对象访问指针数据成员
- 如何通过不同的指针使用类的对象访问结构?(链表)(C++)
- 使用二进制搜索树中的迭代器对象访问左侧节点
- 为什么引用类型在使用临时对象访问时是左值
- 从父对象 c++ 访问子方法
- 无法通过指针或对象 c++ 访问受保护的成员
- 为什么可以从类中的对象访问类的私有变量
- 对类似"struct {double, int}"对象使用reinterpret_cast进行对象访问
- 通过无符号 char 别名进行对象访问,加载和存储时会发生什么?
- 从对象访问结构枚举
- 如何全局创建对象并使用该对象访问全局范围内的公共成员函数
- 在C 中,可以从第三个共享对象访问其他两个不同共享对象
- 如何在C 中提供一个可呼叫的对象访问,例如lambda
- C 向量对象访问
- C++是否可以从同级第二个派生对象访问第一个派生对象的受保护基础数据成员?
- 如何从类内实例化的对象访问私有变量
- 多态性:通过类文本或对象访问静态成员