我有一项任务是在同一个数据集上运行许多相同的实验(并将这些结果取平均值以获得最终结果)。 我在使用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只是一种只读资源。
答案 0 :(得分:1)
代码的另一部分导致了这个问题。所以它与线程无关。 (网站管理员如果认为这个问题没用,请随时删除。)
我在算法中使用非线程安全随机数生成器。这会导致整个麻烦。