1

私の C# プログラムには、メソッド コードがあります。

Object model;
int score;
for()
{
    int tempScore=0;
    Object tempModel=getModel();
    //some interesting stuff modifying value of tempScore
    if(tempScore>score)
    {
        score=tempScore;
        model=tempModel;
    }
}

通常の代わりに Parallel を使用したいのですが、同期の問題が発生するのではないかと心配しています。lock(model) を使用できることはわかっていますが、単純型スコアについてはどうすればよいですか? model と score はメソッドのローカル変数であるため、スレッド間で共有されます。

4

1 に答える 1

2

を使用するlock (model)と、他のスレッドがアクセスできなくなるわけではありませんmodel。つまり、 によって保護されたセクションを 2 つのスレッドがlock (model)同時に実行することはできません。このため、次のようなものを使用してlock (model)アクセスを保護することscoreもできます。

しかし、この場合はうまくいきません。変数をロックせず、オブジェクトをロックし、ループ内で参照するlockオブジェクトを変更します。modelそのため、ここでの最善の選択肢は、別のオブジェクトを作成してロックすることです。

object model;
int score;
object modelLock = new object();

Parallel.For(…, (…) =>
{
    int tempScore=0;
    Object tempModel=getModel();
    //some interesting stuff modifying value of tempScore
    lock (modelLock)
    {
        if(tempScore > score)
        {
            score=tempScore;
            model=tempModel;
        }
    }
});

これがニーズに対して遅すぎることがわかった場合 ( を使用するlockとオーバーヘッドが発生し、それがあなたにとって重要になる可能性があるため)、Thread.VolatileRead()またはのようなものを使用することを検討する必要がありますInterlocked.CompareExchange()。ただし、コードを微妙に間違ってしまうのは非常に簡単なので、非常に注意してください。

于 2012-05-20T13:25:37.187 に答える