2013-09-05 12 views
5

Kilitli sınıfı öğrendim ve sadece kilitlemekten daha hızlı olması gerekiyordu. Şimdi, bu her şey güzel ve güzel, ama uygulama konusunda merak ediyorum.Kilitler nasıl çalışır ve neden kilitlenmekten daha hızlıdır?

Bildiğim kadarıyla, bir değişkendeki işlemin atomik olarak yapılmasını sağlamanın tek yolu, yalnızca bir iş parçacığının bu değişkene zaman içinde her an erişebilmesini sağlamaktır. Hangi kilitleniyor.

Ben kenetlenmiş kaynağını elde etmek için reflektör kullandım, ama buna tüm işi yapmak için harici bir yöntem kullanır gibi görünüyor: aslında iki kat halinde Bazı testler ettik

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

ve Interlocked Nesneyi kilitlemek ve arttırmak kadar hızlıdır.

Nasıl yapıyorlar?

+1

CPU desteği .... – spender

+0

Ne demek istiyorsun? –

cevap

8

Kilitli, atomik işlemi doğrudan yapabilen CPU seviyesinde destekler.

Örneğin, Interlocked.Increment etkin bir şekilde XADD ve karşılaştırmak ve değiştirilebilir (örneğin: Interlocked.CompareExchange) (a LOCK önek ile her ikisi de) CMPXCHG instructions ile desteklenir.

+0

komik olan şey - Ben sadece Interlocked vs ++ testini çalıştırıyorum. Kilitli görünüyor daha hızlı görünüyor –

+0

@ArsenZahray Nasıl kıyaslama yapıyorsunuz? Hata ayıklamada ya da VS test ana bilgisayarında yapıyorsanız, ölçütünüz çok çarpık olacaktır. –

+0

Her işlemi 100000000 kez çalıştırıyorum. Programımı sadece cmd'den çalıştırdım ve sonuç değişmedi (kilit: 00: 00: 02.4291389, kilitli: 00: 00: 01.1740671; ++: 00: 00: 01.4320819 –

İlgili konular