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 进行正常的 insted,但我担心我会遇到一些同步问题。我知道我可以使用 lock(model),但是对于简单类型分数我能做些什么呢?model 和 score 是方法局部变量,因此它们在线程之间共享。

4

1 回答 1

2

如果你用lock (model)了,并不代表其他线程就不能访问了model。这意味着两个线程将无法同时执行受保护的部分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;
        }
    }
});

如果您发现这对于您的需求来说太慢了(因为 usinglock确实有一些开销,这对您来说可能很重要),您应该考虑使用类似Thread.VolatileRead()or的东西Interlocked.CompareExchange()。但是要非常小心它们,因为很容易让你的代码出现微妙的错误。

于 2012-05-20T13:25:37.187 回答