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

时间:2014-06-02 08:23:40

标签: c++ multithreading c++11

我有一项任务是在同一个数据集上运行许多相同的实验(并将这些结果取平均值以获得最终结果)。 我在使用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错误这样的错误)。

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

1 个答案:

答案 0 :(得分:1)

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

我在算法中使用非线程安全随机数生成器。这会导致整个麻烦。