2

クラス Random の静的メンバー関数である newSeed() および rand() の呼び出しを並列化しています。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 に答える