2012-04-13 17 views
5

int val = memLoc[index++];क्या मैं निम्नलिखित कोड लॉक मुक्त/परमाणु बना सकता हूं?

या बेहतर अभी तक

int val = memLoc[index++ & 0xFF];

एक threadsafe एक साझा अंगूठी बफर जहां प्रत्येक कॉल अगले मूल्य हो जाता है से पढ़ने के करने के लिए कोशिश कर रहा है - और मुझे अच्छा लगेगा ताला मुक्त होने के लिए पर अगर सब कुछ संभव है क्योंकि यह एक टन होता है। कोई बूस्ट/सी ++ 11 अनुमति नहीं है :(

+3

आपको [इस आलेख] को पढ़ने में रुचि हो सकती है (http://www.codeproject.com/Articles/43510/Lock-Free-Single-Producer-Single-Consumer-Circular)। –

+3

कोई सी ++ 11 का मतलब है कि आपको प्री-स्टैंडर्ड समाधान की आवश्यकता है। यदि बूस्ट अस्वीकार्य है तो अन्य सभी पुस्तकालय (थिएटर कठोर लाइसेंस शर्तों के साथ) संभवतः बाहर भी हैं, इसलिए आप पोर्टेबल कुछ भी नहीं प्राप्त कर सकते हैं। तो, आपको किस ओएस पर इसकी आवश्यकता है? – MSalters

+0

'memLoc' किस प्रकार का है? क्या यह एक सूचक (या सरणी) 'int' में है? –

उत्तर

6

सिंक्रनाइज़ करने की आवश्यकता वाले एकमात्र ऑपरेशन index मान की वृद्धि है। चूंकि यह केवल एक संख्यात्मक मान है, यह परमाणु वृद्धि के माध्यम से ताले के उपयोग के बिना किया जा सकता है। आपरेशन आप सूचीबद्ध के बाकी एक साझा स्थान का सिर्फ पढ़ता कर रहे हैं और सिंक्रनाइज़ किए जाने की जरूरत नहीं है।

पर Win32 वेतन वृद्धि सिंक्रनाइज़ InterlockedIncrement समारोह के साथ किया जाता बनाने

int oldValue = InterlockedIncrement(&index); 
int val = memLoc[oldValue & 0xFF]; 

वहाँ विभिन्न सिंक्रनाइज़ किए जाते हैं लिनक्स पर उपलब्ध वृद्धि कार्य। एक काफी गुओ है घ चर्चा

+2

सी ++ 11 में, 'std :: atomic_fetch_add' है जो चाल चलाना चाहिए। –

+0

क्या कोई आर्किटेक्चर हैं जहां 'int' लिखना परमाणु नहीं होगा (जहां आपको तत्व को सिंक्रनाइज़ करना होगा)? –

+0

@MarkB समस्या केवल तत्व का परमाणु लेखन नहीं है, यह परमाणु लेखन + पुराने मूल्य को पढ़ना + यह सुनिश्चित करना है कि यह सभी प्रोसेसर में देखा गया है। आमतौर पर आपको इसके लिए एक विशेष निर्देश की आवश्यकता होती है। मेरे जवाब को देखते हुए मैंने कुछ स्थानों पर परमाणु का दुरुपयोग किया। इसे साफ करने के लिए जा रहे हैं। – JaredPar

1

इस stackoverflow धागे पर विकल्प आप को बढ़ा देते हैं और एक परमाणु आपरेशन में सूचकांक वापस पढ़ने की जरूरत है इस बारे में। दुर्भाग्यवश ++ ऑपरेटर किसी भी परमाणु की गारंटी नहीं देता है।

अधिकांश प्रोसेसर के पास कुछ प्रकार का फ़ेच-इंकमेंट-स्टोर निर्देश होता है जिसका उपयोग किया जा सकता है। आप ऐसा करने के लिए इनलाइन असेंबली डाल सकते हैं। http://msdn.microsoft.com/en-us/library/windows/desktop/ms684122(v=vs.85).aspx

यदि आप किसी अन्य ओएस पर हैं, तो वहाँ की संभावना इसी तरह की सुविधा है: http://en.wikipedia.org/wiki/Fetch-and-add

आप Windows पर चला रहे हैं, एमएस इस पहुँचने के लिए एक एपीआई प्रदान करता है। हालांकि, किसी भी मामले में, आपको परमाणु fetch-increment-store प्राप्त करने के लिए ओएस या निचले प्रकार की पहुंच की आवश्यकता होगी।

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