2012-04-10 121 views
2

我正在调用newSeed()和rand()类的Random静态成员函数。 newSeed()提供了Random类的静态成员(我们称之为种子)。更具体的,我并行调用该函数在另一个类,方法类:静态成员和多线程

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

如果newSeed是一个静态方法,它将改变所有线程的种子。你只应该种一次PRNG,不需要多次。 – 2012-04-10 07:12:49

+2

没有看到Random类的定义很难说。你说这些方法是静态的,所以没关系它是每个线程上的一个新实例,但是可能存在用于种子的线程本地存储,所以它可能每个线程都不相同。不发布随机类的代码,你不能得到明确的答案。 – 2012-04-10 07:15:44

回答

4

静态字段在进程类的所有实例中共享。 此外,线程在同一进程,意义正在共享的运行内存,使用相同的类

所以,如果你修改静态字段种子,所有的“随机”实例的所有线程会有修改。

0

如果newSeed()是静态的并修改了一些数据 - 从单独的线程调用它是不安全的。您需要下列操作之一:

一)使它不是静态

B)不要把它的线程函数

C)把一些互斥体,防止螺纹冲突。