C#中的局部volatile变量

时间:2012-05-19 20:19:29

标签: c# .net for-loop parallel-processing

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

1 个答案:

答案 0 :(得分: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;
        }
    }
});

如果您发现这对您的需求来说太慢(因为使用lock会产生一些开销,这对您来说可能很重要),您应该考虑使用Thread.VolatileRead()或{{ 3}}。但要非常小心,因为很容易让你的代码出现错误。