2013-09-05 10 views
5

मैंने अभी इंटरलॉक क्लास के बारे में सीखा है और यह केवल लॉकिंग से तेज़ होना चाहिए। अब, यह सब अच्छा और अच्छा है, लेकिन मैं कार्यान्वयन के रूप में उत्सुक हूँ।इंटरलाक्ड काम कैसे करता है और यह लॉक से तेज़ क्यों है?

जहां तक ​​मुझे पता है, यह सुनिश्चित करने का एकमात्र तरीका है कि एक चर पर ऑपरेशन परमाणु रूप से किया जाता है यह सुनिश्चित करने के लिए कि केवल एक ही थ्रेड किसी भी समय उस चर को एक्सेस कर सकता है। जो लॉक है।

मैं परावर्तक का उपयोग किया है Interlocked का स्रोत प्राप्त करने के लिए, लेकिन यह यह बाह्य विधि का उपयोग करता है अपने सभी काम करने के लिए लगता है:

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

मैं कुछ परीक्षण चला गया है, और Interlocked तथ्य दो बार है में जितनी जल्दी हो सके ऑब्जेक्ट को लॉक करें और इसे बढ़ाएं।

वे यह कैसे कर रहे हैं?

+1

सीपीयू समर्थन .... – spender

+0

आपका क्या मतलब है? –

उत्तर

8

इंटरलाक्ड सीपीयू स्तर पर समर्थन करता है, जो सीधे परमाणु संचालन कर सकता है।

उदाहरण के लिए, Interlocked.Increment प्रभावी रूप से एक XADD है, और की तुलना करने और स्वैप (यानी: Interlocked.CompareExchange) CMPXCHG instructions के माध्यम से (दोनों एक LOCK उपसर्ग के साथ) समर्थित है।

+0

मजाकिया बात यह है - मैं सिर्फ एक परीक्षण इंटरलॉक बनाम ++ चलाता हूं। इंटरलाक्ड तेजी से लगता है –

+0

@ArsenZahray आप बेंचमार्किंग कैसे कर रहे हैं? यदि आप इसे डीबग में कर रहे हैं, या वीएस टेस्ट होस्ट के तहत, तो आपका बेंचमार्क अत्यधिक खराब हो जाएगा। –

+0

मैं प्रत्येक ऑपरेशन 100000000 बार चलाता हूं। और मैंने अभी सीएमडी से अपना प्रोग्राम चलाया, और परिणाम नहीं बदला (लॉक: 00: 00: 02.429138 9, इंटरलॉक: 00: 00: 01.1740671; ++: 00: 00: 01.4320819 –

संबंधित मुद्दे