2012-05-19 76 views
1

在我的C#程序,我有方法的代碼:本地volatile變量

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; 
    } 
} 

我想用並行進行的正常insted的,但我怕我會遇到一些同步問題。我知道我可以使用鎖定(模型),但是我可以對簡單類型分數做些什麼? 模型和分數是方法局部變量,因此它們在線程之間共享。

+0

該代碼片段不夠清晰。考慮線程局部變量。基本的操作指南文章位於:http://msdn.microsoft.com/en-us/library/dd460703.aspx –

+0

我們需要知道哪些變量在線程之間共享。我們可以猜測'score'是共享的。您可以在地圖/縮小算法中使用線程局部分數。或者你可以使用互鎖操作。或者鎖定。 –

回答

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()Interlocked.CompareExchange()。但要非常小心,因爲讓你的代碼巧妙地錯誤很容易。

+0

非常感謝!看起來像VolatileRead正是我正在尋找的,它的工作原理! – Skiba