2013-01-10 2 views
0

다중 스레드에서 호출 할 수있는 public Action Update; 필드가 있습니다. 또한이 필드는 null로 변경할 수 있습니다. 속성을 만들고 내부에 lock 문을 사용해야합니까? 또는 내가 Update = new Action (...)을 원자 적 연산으로 설정할 때 잠금이 필요하지 않습니까?작업 대리자 및 다중 스레드 동기화

답변

3

C#에서 참조를 설정하는 것은 원 자성 작업이므로 잠금이 필요하지 않습니다. 변경할 때 제대로 모든 스레드에 걸쳐 갱신되어 있는지 확인하기 Update 참조 휘발성해야하지만 :

public volatile Action Update; 

에 관계없이 스레딩, 항상 회원을 직접 노출이 아니라 속성을 사용하지하는 것이 좋습니다. 그런 다음 자동 등록 배제 휘발성 재산에 대한 백업 저장소 확인해야합니다 :

private volatile Action update; 

public Action Update 
{ 
    get { return update; } 
    set { update = value; } 
} 
+0

1 : 멋진 대답! setter에서'= '를 잊어 버렸습니다. – Douglas

+0

감사합니다. 다음과 같은 것이 필요하다고 느꼈습니다 :-) – zgnilec

+0

대리인을 호출하기 전에 null을 확인할 때 가능한 경쟁 조건을주의하십시오. –

4

이 앤더스에 의해 대답에 따라,하지만 당신은 당신이 할 경우 지역 변수에 일시적 변수의 값을 저장해야 경쟁 조건을 피하기 위해 null-check.

나쁜 예 :

if(myClass.Update != null) 
{ 
    // Race condition if Update is set to null here by another thread 
    myClass.Update(); 
} 

좋은 예 :

var updateMethod = myClass.Update; 
if(updateMethod != null) 
{ 
    // No race condition since we try to call 
    // the same value that we checked for null 
    updateMethod(); 
}