在我的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是方法局部变量,因此它们在线程之间共享。
答案 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}}。但要非常小心,因为很容易让你的代码出现错误。