2

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

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

谢谢并恭祝安康。

4

2 回答 2

5

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

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

于 2012-04-10T07:15:37.417 回答
0

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

a) 让它不是静态的

b) 不要称它为线程函数

c) 放一些互斥体来防止线程冲突。

于 2012-04-10T08:55:30.400 回答