2011-03-14 8 views
5

하나의 스레드에서 불변 개체가 new'ed되고 두 번째 스레드에서 공유되면 (예 : 공유 개체의 필드) 두 번째 스레드가 동기화되지 않아야합니까?C#의 메모리 장벽을 통해 불변 개체에 액세스해야합니까?

Thread1: 
========= 
x = new SomeObject() 

Thread2 
========= 
if (x != null) 
x.DoSomething() 

x.DoSomething() 전에 메모리 장벽이 있어야합니까? 첫 번째 스레드에서 x에 대한 할당이 두 번째 스레드에서 결코 보이지 않을 수 있습니까? .NET의 안전한 게시 패턴은 무엇입니까?

답변

2

예, 스레드 2가 코드 최적화 방법에 따라 작성한 코드로 null이 아닌 x 값을 결코 볼 수 없습니다. 명시 적 메모리 장벽이 필요하지 않습니다. x를 volatile로 선언하십시오.

+0

확인. .NET에 대한 안전한 출판 관련 정보/문서가 있습니까? – drr

+1

나는 당신이하고 싶은 일에 달려 있다고 생각합니다. MSDN의 Parallel Patterns 라이브러리를 살펴 보겠습니다. 그 외에도, 당신은 거의 동기화 프리미티브를 가지고 있습니다. Joe Duffy의 웹 로그를 확인할 수도 있습니다. 그는 잠금과 병렬 데이터 액세스의 미세한 점에 대해 꽤 많이 이야기합니다. –

+0

필자는 이렇게 말하는 문서를 모르지만 쓰기가 안전하고 읽기에는 메모리 펜스가 필요합니다. 위에서 언급 한 여러 가지 방법을 통해 얻을 수있는 것은 Lock, volatile, Thread.VolatileRead/Write, MemoryBarrier에 대한 명시 적 호출입니다. 자세한 내용은 [C#의 스레딩] (http://www.albahari.com/threading/part4.aspx#_Memory_Barriers_and_Volatility)을 참조하십시오. – BrandonAGr