2013-09-05 12 views
5

私はちょうどインターロックされたクラスを学びました、そして、それは単純にロックするよりも速くなるはずです。さて、これはすごくいいですが、私は実装に関して興味があります。インターロックはどのように機能し、なぜロックよりも速いのですか?

私が知る限り、変数に対する操作が原子的に行われるようにする唯一の方法は、いつでもその変数に1つのスレッドしかアクセスできないようにすることです。ロックされている

私はインターロックのソースを取得するために反射板を使用しましたが、それは、そのすべての作業を行うために、外部メソッドを使用しているようです:

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

私はいくつかのテストを実行した、と実際にインターロックさの2倍です単にオブジェクトをロックしてインクリメントするだけの速さです。

彼らはどのようにしていますか?

+1

CPUサポート.... – spender

+0

どういう意味ですか? –

答えて

8

インターロックはCPUレベルでサポートされており、アトミック操作を直接行うことができます。

たとえば、Interlocked.Incrementを効果XADDであり、比較およびスワップ(すなわち:Interlocked.CompareExchange)(LOCK接頭辞の両方)CMPXCHG instructionsを介して支持されています。

+0

面白いのは、私はちょうどインターロッキングされたvs ++テストを実行します。連動しているほうが速いようです –

+0

@ArsenZahrayベンチマークはどうですか?あなたがデバッグやVSテストホストの下でそれをやっているなら、あなたのベンチマークは非常に歪んでいるでしょう。 –

+0

私は各操作を100000000回実行します。そして、私はちょうどcmdから私のプログラムを実行し、結果は変わらなかった(ロック:00:00:02.4291389、連動:00:00:01.1740671; ++:00:00:01.4320819 –

関連する問題