2012-05-19 4 views
1

, 나는 방법 코드를 가지고있다 : 나는 보통의 insted을위한 병렬를 사용하고 싶습니다지역의 휘발성 변수는 내 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; 
    } 
} 

,하지만 난 내가 어떤 동기화 문제가 발생할 것 같군요. 잠금 (모델)을 사용할 수 있다는 것을 알고 있지만 간단한 유형 점수에 대해서는 어떻게해야합니까? 모델 및 점수는 메소드 로컬 변수이므로 스레드간에 공유됩니다.

+0

스 니펫이 명확하지 않습니다. 스레드 로컬 변수를 고려하십시오. 필수적인 방법은 다음 문서를 참조하십시오. http://msdn.microsoft.com/en-us/library/dd460703.aspx –

+0

스레드간에 공유되는 변수를 알아야합니다. 우리는 '점수'가 공유된다고 생각할 수 있습니다. 지도/축소 알고리즘에서 스레드 로컬 스코어를 사용할 수 있습니다. 또는 연동 작업을 사용할 수도 있습니다. 또는 잠금. –

답변

2

lock (model)을 사용하는 경우 다른 스레드가 model에 액세스 할 수 없다는 의미는 아닙니다. 두 스레드가 동시에 lock (model)으로 보호되는 섹션을 실행할 수 없다는 것입니다. 이 때문에 score에 대한 액세스를 보호하기 위해 lock (model)과 같은 것을 사용할 수 있습니다.

그러나이 경우에는 작동하지 않는입니다. 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

고마워, 많이! VolatileReady가 내가 찾고있는 것처럼 보입니다. – Skiba