साझा स्मृति का उपयोग करते समय, प्रत्येक प्रक्रिया साझा क्षेत्र को अपने संबंधित पता स्थान के एक अलग क्षेत्र में एमएमएपी कर सकती है। इसका अर्थ यह है कि साझा क्षेत्र के भीतर पॉइंटर्स को संग्रहीत करते समय, आपको साझा क्षेत्र की शुरुआत के store them as offsets की आवश्यकता होती है। दुर्भाग्यवश, यह परमाणु निर्देशों का उपयोग जटिल करता है (उदाहरण के लिए यदि आप lock free algorithm लिखने की कोशिश कर रहे हैं)। उदाहरण के लिए, कहें कि आपके पास एक एकल लेखक द्वारा बनाई गई साझा स्मृति में संदर्भ गिनती नोड्स का एक गुच्छा है। लेखक समय-समय पर सकारात्मक संदर्भ गणना के साथ एक मान्य नोड को इंगित करने के लिए परमाणु रूप से एक सूचक 'पी' अद्यतन करता है। पाठक परमाणु रूप से 'पी' लिखना चाहते हैं क्योंकि यह नोड (एक संरचना) की शुरुआत को इंगित करता है जिसका पहला तत्व संदर्भ संख्या है। चूंकि पी हमेशा एक वैध नोड को इंगित करता है, इसलिए रेफरी गिनती बढ़ाना सुरक्षित है, और इसे 'पी' को सुरक्षित करने और अन्य सदस्यों तक पहुंचने में सुरक्षित बनाता है। हालांकि, यह सब केवल तभी काम करता है जब सबकुछ एक ही पता स्थान पर होता है। नोड्स और 'पी' सूचक साझा स्मृति में जमा हो जाती है, तो ग्राहकों को एक रेस स्थिति भुगतना: = x + y पर ऑफसेट क्या ऑफसेट का उपयोग किये बिना साझा मेमोरी में पॉइंटर्स स्टोर करना संभव है?
- एक्स = पढ़ पी
- y
चरण 2 के दौरान, पी बदल सकता है और x अब मान्य नोड को इंगित नहीं कर सकता है। एकमात्र कामकाज मैं सोच सकता हूं कि किसी भी तरह से सभी प्रक्रियाओं को साझा स्मृति को मैप करने के लिए सहमत होने के लिए मजबूर करना है, ताकि ऑफसेट्स के बजाय असली पॉइंटर्स mmap'd क्षेत्र में संग्रहीत किए जा सकें। क्या उसे करने का कोई तरीका है? मैं mmap दस्तावेज में MAP_FIXED देखता हूं, लेकिन मुझे नहीं पता कि मैं एक ऐसा पता कैसे चुन सकता हूं जो सुरक्षित होगा।
संपादित करें: x86 पर इनलाइन असेंबली और 'लॉक' उपसर्ग का उपयोग करना संभवतः "जेड द्वारा ऑफसेट वाई के साथ वृद्धि पीआरटी एक्स" बनाना संभव है? अन्य आर्किटेक्चर पर समतुल्य विकल्प? बहुत सारी सभाएं नहीं लिखी हैं, यह नहीं पता कि आवश्यक निर्देश मौजूद हैं या नहीं।
यदि cmpxchg पहले से ही परमाणु पढ़ने और परमाणु लेखन करता है, तो 'लॉक' आवश्यक है? या यह सुनिश्चित करता है कि edi + edx परमाणु रूप से किया जाता है? मैंने कभी भी वास्तव में एमआईपीएस असेंबली का उपयोग किया है। –
मेमोरी बस पर परमाणु पहुंच की गारंटी लॉक करें ताकि लॉक निर्देश आवश्यक हो। आप शायद एपीआई इंटरलाक्ड कॉम्पैयर एक्सचेंज का भी उपयोग कर सकते हैं (स्पष्टीकरण के लिए एमएसडीएन जांचें)। पहले लोड करें 32 बिट पॉइंटर को OldValue के रूप में और न्यूवैल्यू प्राप्त करने के लिए इसे बढ़ाने से पहले, इंटरलॉक कॉम्पैयर एक्सचेंज करने का प्रयास करें। InterlockedCompareExchange (गंतव्य + ऑफ़सेट, न्यूवेल्यू, ओल्डवैल्यू) तुलनात्मक मूल्य वापस कर देगा यदि पुराने धागे के समान नहीं है, तो कुछ अन्य धागे की तुलना में इसका आदान-प्रदान किया जाता है, इसलिए कोई विनिमय नहीं किया गया था और आपको प्रक्रिया को दोहराना होगा। –