2013-09-05 49 views
5

我剛剛瞭解到互鎖類,它應該比簡單的鎖定更快。現在,這一切都很好,但我對實施感到好奇。Interlocked如何工作,爲什麼它比鎖更快?

據我所知,確保對變量的操作是自動完成的唯一方法是確保只有一個線程可以隨時訪問該變量。這是鎖定。

我使用反射來獲得互鎖的來源,但似乎它使用外部方法來完成其所有工作:

[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)經由CMPXCHG instructions支持(均用LOCK前綴)。

+0

有趣的是 - 我只是運行一個測試Interlocked vs ++。聯鎖似乎更快 –

+0

@ArsenZahray你有什麼標杆?如果您在調試或VS測試主機下進行測試,則您的基準測試結果將出現高度偏差。 –

+0

我運行每次操作100000000次。我只是從cmd運行我的程序,結果沒有改變(鎖:00:00:02.4291389,interlocked:00:00:01.1740671; ++:00:00:01.4320819 –

相關問題