从多个线程访问类对象

Accessing class object from multiple threads

本文关键字:对象 访问 线程      更新时间:2023-10-16

假设我有一些容器类,如下一个:

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。

最后,我想提及线程安全 - 我在这里看不到任何比赛,我相信您明确确保该示例没有暗示您可能会遇到任何比赛(仅显示访问阅读而不是写作共享资源(,但是检查它们仍然是一个好主意。如果您正在做的只是阅读,则不会发生任何数据竞赛。