静态成员和多线程

时间:2012-04-10 07:07:13

标签: c++ multithreading static

我正在并行调用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类实例(以及所有线程)修改种子?

请告诉我是否必须澄清问题。

谢谢和问候。

2 个答案:

答案 0 :(得分:5)

静态字段在进程类的所有实例之间共享。 此外,线程在相同的进程中运行,这意味着共享内存,使用相同的类

因此,如果修改静态字段种子,则所有线程中的所有“Random”实例都将进行修改。

答案 1 :(得分:0)

如果newSeed()是静态的并且修改了一些数据 - 从单独的线程调用它是不安全的。你需要其中一个:

a)使它不是静态的

b)不要将其称为线程函数

c)放置一些互斥锁以防止线程冲突。