2013-09-05 14 views
5

Ich habe gerade von der Interlocked-Klasse gelernt und dass es schneller sein soll als einfach zu sperren. Nun, das ist alles schön und gut, aber ich bin neugierig auf die Umsetzung.Wie funktioniert Interlocked und warum ist es schneller als Lock?

Soweit ich weiß, ist die einzige Möglichkeit sicherzustellen, dass die Operation für eine Variable atomar ausgeführt wird, um sicherzustellen, dass nur ein Thread jederzeit auf diese Variable zugreifen kann. Welche ist gesperrt?

Ich habe Reflektor verwendet, um die Quelle von Verschlungene zu bekommen, aber es scheint, dass es externe Methode nutzt alle seine Arbeit zu tun:

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

ich einige Tests ausgeführt haben, und Verschlungene in der Tat doppelt so groß ist So schnell wie einfach das Objekt sperren und inkrementieren.

Wie machen sie das?

+1

CPU-Unterstützung .... – spender

+0

was meinst du? –

Antwort

8

Interlocked hat Unterstützung auf der CPU-Ebene, die die atomare Operation direkt ausführen kann.

Zum Beispiel ist effektiv ein Interlocked.IncrementXADD und Vergleichs- und Auslagerungs (dh: Interlocked.CompareExchange) über die CMPXCHG instructions (beide mit einem LOCK prefix) unterstützt.

+0

die lustige Sache ist - ich starte nur einen Test Interlocked vs ++. Interlocked scheint schneller –

+0

@ArsenZahray Wie bewerten Sie Benchmarking? Wenn Sie es im Debug oder unter dem VS-Testhost durchführen, wird Ihr Benchmark stark verzerrt sein. –

+0

Ich führe jede Operation 100000000 mal. Und ich habe gerade mein Programm von der cmd ausgeführt, und das Ergebnis hat sich nicht geändert (lock: 00: 00: 02.4291389, gesperrt: 00: 00: 01.1740671; ++: 00: 00: 01.4320819 –

Verwandte Themen