C++ C++;11多个线程共享一个公共类变量
我的任务是在同一个数据集上运行许多相同的实验(并平均这些结果以获得最终结果)。 我在使用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. }
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,这很奇怪。至少,您应该让实验持有指向数据中心的指针,而不是引用。(引用类成员很少有用,因为它们限制了修改该类对象以引用新数据中心的能力)。