2013-09-05 15 views
5

Właśnie dowiedziałem się o sprzężonej klasie i że ma być szybszy niż zwykłe blokowanie. To wszystko jest miłe i dobre, ale jestem ciekawy co do wdrożenia.Jak działa funkcja Interlocked i dlaczego jest szybsza niż blokada?

O ile mi wiadomo, jedynym sposobem na zapewnienie, że operacja na zmiennej jest wykonywana atomowo, jest upewnienie się, że tylko jeden wątek może uzyskać dostęp do tej zmiennej w dowolnym momencie. Które jest blokowanie.

Użyłem reflektor, aby uzyskać źródło zblokowane, ale wydaje się, że wykorzystuje metodę zewnętrznego zrobić wszystkie prace:

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

Zabrakło mi kilka testów i blokadą w Faktem jest dwukrotnie tak szybko, jak po prostu zablokuj obiekt i zwiększ go.

Jak oni to robią?

+1

Wsparcie procesora .... – spender

+0

co masz na myśli? –

Odpowiedz

8

Interlocked ma wsparcie na poziomie procesora, który może bezpośrednio wykonywać operację atomową.

Przykładowo Interlocked.Increment to w praktyce XADD i Porównaj i Wymień (tj Interlocked.CompareExchange) jest podtrzymywany przez CMPXCHG instructions (zarówno z LOCK prefiksu).

+0

Zabawna rzecz - po prostu wykonuję test Interlocked vs ++. Interlocked wydaje się szybszy –

+0

@ArsenZahray Jak się masz benchmarking? Jeśli robisz to podczas debugowania lub na hoście testowym VS, twój benchmark będzie mocno przekrzywiony. –

+0

Każdą operację wykonuję 100000000 razy. I po prostu uruchomiłem program z cmd, a wynik się nie zmienił (blokada: 00: 00: 02.4291389, zablokowana: 00: 00: 01.1740671, ++: 00: 00: 01.4320819 –

Powiązane problemy