2013-06-14 2 views
2

다음 문 (첫 번째와 세 번째 매개 변수와 동일한 변수를 사용)은 변수 b가 완료시 변수 c의 값을 가져 오게하거나 다른 스레드가 가져 오는 동안 하나 이상의 매개 변수를 변경하게 할 수 있습니까 비교 연산 중에 다른 값을 포함하는 첫 번째와 세 번째 매개 변수?Interlocked.CompareExchange의 매개 변수가 원자 적 작업의 일부입니까?

a = Interlocked.CompareExchange(ref b, c, b) 
+0

시도하는 테스트를 작성하는 데 약 2 분이 걸리는 것처럼 보입니다. 물론 대답은 예스가 바뀔 수있는 경우에만 질문에 명확하게 대답 할 것입니다. –

답변

2

흥미로운 질문입니다. 필드의 값이 ldfld (최종 매개 변수) 이후에 사소하게 변경 될 수 있지만 주소 (이전에 ldflda을 통해 획득 됨)를 통해 평가되기 전에 그 대답은 "보장되지 않습니다"라고 의심됩니다. 학술적으로, 이와 같이 스레딩 코드 에서처럼 중요한 것은 명백하게 뭔가를하는 것입니다.

확실히 "보장 할 수 없다"는 것은 우리가 많이 결정할 수 없으므로 쓸모 없게됩니다. 에 "그것이 보장됩니다"라는 대답을 원하면 Interlocked.Exchange을 사용하는 것이 더 쉽고 분명해 질 수 있으므로 질문은 의미가 없습니다.

+0

설명 :'b'도'ref' 인수 일 수 있습니다.'ldarg' /'ldarga' - 나머지는 의미합니다 –

+0

추가 설명 :'b'의 값이 * 이미 변경되었을 수 있습니다 * 즉'ldfld' /'ldarg' 이전에 - 그리고 우리는 로컬 캐시에서 이전 값을 다시로드 할 수 있습니다 ('volatile'으로 표시되지 않았다고 가정하면'ref'에 대한 컴파일러 경고를 생성합니다). –

관련 문제