2013-09-05 4 views
5

방금 ​​연동 클래스를 배웠고 단순히 잠금보다 빠르다고합니다. 자,이 모든 것이 훌륭하고 훌륭합니다. 그러나 구현에 관해서는 궁금합니다.인터록은 어떻게 작동하며 왜 잠금보다 빠릅니까?

아는 한, 변수에 대한 연산이 원자 적으로 수행되도록하는 유일한 방법은 항상 한 스레드 만 해당 변수에 액세스 할 수 있도록하는 것입니다. 어떤 잠금입니다.

나는 연동의 소스를 얻기 위해 반사판을 사용했지만, 모든 작업을 수행하는 외부 방법을 사용하는 것 : 사실은 두 배에서 나는 몇 가지 테스트를 실행 한

[MethodImpl(MethodImplOptions.InternalCall), ReliabilityContract(Consistency.WillNotCorruptState, Cer.Success)] 
internal static extern int ExchangeAdd(ref int location1, int value); 

, 그리고 연동 객체를 잠그고 증가 시키면됩니다.

어떻게 그 일을하고 있습니까?

+1

CPU 지원 .... – spender

+0

무엇을 의미합니까? –

답변

8

인터록은 CPU 수준에서 지원되므로 원자 단위 작업을 직접 수행 할 수 있습니다.

예를 들어, Interlocked.Increment을 효과적으로 XADD이고, 비교 및 ​​교환 (즉 : Interlocked.CompareExchange) (a LOCK 프리픽스 모두)를 CMPXCHG instructions 통해 지원된다.

+0

재미있는 점은 - 나는 단지 Interlocked vs ++ 테스트를 실행합니다. 연동이 더 빠릅니다. –

+0

@ArsenZahray 어떻게 벤치마킹합니까? 디버그 또는 VS 테스트 호스트에서 수행하는 경우 벤치 마크가 크게 왜곡됩니다. –

+0

각 작업을 100000000 회 실행합니다. 그리고 방금 cmd에서 프로그램을 실행했는데 결과가 변경되지 않았습니다 (잠금 : 00 : 00 : 02.4291389, 연동 : 00 : 00 : 01.1740671, ++ : 00 : 00 : 01.4320819 –