2012-04-10 57 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)把一些互斥體,防止螺紋衝突。