我正在并行调用newSeed()和rand(),类Random的静态成员函数。 newSeed()提供Random类的静态成员(让我们称之为种子)。更具体地说,我在另一个类Method类中并行调用此函数:
double* Method::randomPoint(double* bottom_, double* top_ )
{
try{
Random generator_ ;
double* pt_ = new double[m_ndim];
generator_.newSeed();
for(int i=0;i<m_ndim;i++)
{
pt_[i]= generator_.rand(bottom_[i],top_[i]);
}
return pt_;
}
catch(...)
{
return NULL;
}
}
总而言之,在每个并行调用中,我创建了一个新的Random类实例,我在这个对象中调用了newSeed()和rand()方法。由于newSeed()是在给定的实例上调用的,我希望newSeed()初始化此对象的种子成员 - 因此只对此线程进行初始化。由于种子是静态的并且newSeed()也是静态的,我是否为所有当前运行的Random类实例(以及所有线程)修改种子?
请告诉我是否必须澄清问题。
谢谢和问候。
答案 0 :(得分:5)
静态字段在进程类的所有实例之间共享。 此外,线程在相同的进程中运行,这意味着共享内存,使用相同的类
因此,如果修改静态字段种子,则所有线程中的所有“Random”实例都将进行修改。
答案 1 :(得分:0)
如果newSeed()是静态的并且修改了一些数据 - 从单独的线程调用它是不安全的。你需要其中一个:
a)使它不是静态的
b)不要将其称为线程函数
c)放置一些互斥锁以防止线程冲突。