C++ C++;11多个线程共享一个公共类变量

C++ C++;11多个线程共享一个公共类变量,c++,multithreading,c++11,C++,Multithreading,C++11,我的任务是在同一个数据集上运行许多相同的实验(并平均这些结果以获得最终结果)。 我在使用C++11线程时遇到了奇怪的问题。这是我的课程大纲 首先,我有一个数据中心类DataCenter,它表示一个只读数据集 class DataCenter { public: int data[8]; ... public: DataCenter() { // load data from files. }

我的任务是在同一个数据集上运行许多相同的实验(并平均这些结果以获得最终结果)。 我在使用C++11线程时遇到了奇怪的问题。这是我的课程大纲

首先,我有一个数据中心类
DataCenter
,它表示一个只读数据集

    class DataCenter {
    public: 
        int data[8];
    ...
    public:
        DataCenter() {
            // load data from files.
        }
    }
接下来,我使用一个类来定义一个实验的逻辑

    class Experiment{
    private:
        DataCenter & dc;            
        int local_vars[8];
    public:
        Experiment(DataCenter &dc): dc(dc) {}
        void run(int param1, int param2) {
            // some algorithm using dc and local_variables
        }
    }
我想用多线程加速我的实验,因为我有一台8核的机器。这是我的主要功能

    int main(){
        DataCenter dc;
        Experiment exp1(dc), exp2(dc);
        std::thread t1([exp1] { exp1.run(1, 1); });
        std::thread t2([exp2] { exp2.run(2, 2); });
        t1.join();
        t2.join();
        return 0;
    }
当只使用一个线程(例如注释t2)时,程序运行良好。但是,当使用两个线程时,程序会崩溃(一些错误,如ArrayIndexOutofBounds错误)


因此,似乎两个线程共享一个公共类
数据中心
导致了这个问题。为什么会发生这种情况,因为数据中心只是一个只读资源。

代码的另一部分导致了该问题。所以它与线程无关。(如果网站管理员认为这个问题没有用,请随时删除。)


我在算法中使用了一个非线程安全的随机数生成器。这会导致整个问题。

如果
数据中心&dc
是只读资源,为什么不使用
const
?代码中没有任何东西会导致任何问题。您应该包含足够的代码,以便我们能够真实地再现问题。即使如此,您仍能通过值捕获
实验
s,这很奇怪。至少,您应该让实验持有指向数据中心的指针,而不是引用。(引用类成员很少有用,因为它们限制了修改该类对象以引用新数据中心的能力)。