के बराबर समकक्ष मैं LWARX और STWCX (जैसा कि पावरपीसी प्रोसेसर पर पाया गया है) या x86 प्लेटफॉर्म पर समान कार्यक्षमता को लागू करने का एक तरीका ढूंढ रहा हूं। साथ ही, ऐसी चीजों के बारे में जानने के लिए सबसे अच्छी जगह कहां होगी (यानी लॉक/प्रतीक्षा-मुक्त प्रोग्रामिंग के लिए अच्छे लेख/वेब साइट/फ़ोरम)।x86 LWARX और STWCX
संपादित
मैं मुझे लगता है कि मैं सिर्फ एक कैस के लिए देख रहा हूँ (तुलना और स्वैप) आपरेशन के रूप में यह मान लिया जा रहा है और अधिक जानकारी देने के लिए आवश्यकता हो सकती है लगता है। जो मैं करने की कोशिश कर रहा हूं वह स्मार्ट पॉइंटर्स के साथ लॉक-फ्री संदर्भ गिनती प्रणाली को कार्यान्वित कर रहा है जिसे एकाधिक थ्रेडों द्वारा एक्सेस और बदला जा सकता है। मुझे मूल रूप से x86 प्रोसेसर पर निम्न फ़ंक्शन को लागू करने का एक तरीका चाहिए।
int* IncrementAndRetrieve(int **ptr) { int val; int *pval; do { // fetch the pointer to the value pval = *ptr; // if its NULL, then just return NULL, the smart pointer // will then become NULL as well if(pval == NULL) return NULL; // Grab the reference count val = lwarx(pval); // make sure the pointer we grabbed the value from // is still the same one referred to by 'ptr' if(pval != *ptr) continue; // Increment the reference count via 'stwcx' if any other threads // have done anything that could potentially break then it should // fail and try again } while(!stwcx(pval, val + 1)); return pval; }
मैं वास्तव में कुछ है कि नकल करता LWARX और STWCX अच्छी तरह सटीक इस बंद को खींचने के लिए (मैं CompareExchange, स्वैप के साथ ऐसा कर या कार्यों मैं अब तक के लिए मिल गया है डालने का एक तरीका को समझ नहीं सकता की जरूरत है x86)।
धन्यवाद
डीसीएएस लगभग सही दिखता है, सिवाय इसके कि मैं ऐसा करने के लिए केवल 1 शब्द बदलने की आवश्यकता है यदि ऐसा करने के दौरान उस शब्द का सूचक बदल नहीं जाता है (यह थोड़ा उलझन में है, उम्मीद है कि प्रश्न का अद्यतन इसे स्पष्ट करने में मदद करता है)। –
मैं डीसीएएस का उपयोग करके एक वर्कअराउंड खोजने में कामयाब रहा, यह मूर्खतापूर्ण नहीं है, क्योंकि यह एक अद्वितीय आईडी (आकार में 4 बाइट्स) का उपयोग करता है लेकिन इसे तोड़ने की संभावनाएं पतली हैं क्योंकि 4 बाइट यूआईडी और 4 बाइट काउंटर दोनों इसके समीप होंगे बिल्कुल दोहराया गया। यह केवल एक समस्या है यदि वस्तु किसी चीज को स्मृति को फिर से सौंपती है और फिर उन 8 बाइट्स को डुप्लिकेट करने का प्रबंधन करती है, जबकि दूसरा धागा एक सूचक की प्रतिलिपि बनाने का प्रयास कर रहा है, जो एक अपेक्षाकृत छोटा ऑपरेशन है (ऑपरेशन के अनुसार, लंबाई केवल लंबी है थ्रेड बाधित होने पर पर्याप्त है) –
मुझे विशेष रूप से पीपीसी के बारे में पता नहीं है, लेकिन अधिकांश मशीनों पर, लोड-एक्सक्लूसिव/स्टोर-सशर्त निर्देश वास्तव में एबीए समस्या से मदद नहीं करते हैं क्योंकि लोड-अनन्य के बीच मेमोरी ऑपरेशंस और स्टोर-सशर्त स्टोर स्टोर सशर्त ऑपरेशन को असफल रूप से विफल कर सकता है। यदि कोई संरक्षित स्थान को दोबारा पढ़ता है और देखता है कि यह बदल गया है, तो कोई यह बता सकता है कि किसी और ने इसे एक नए मूल्य के साथ लिखा है, लेकिन यदि पिछले पाठ के समान मूल्य है, तो एक सहज विफलता को अलग करने का कोई तरीका नहीं होगा एक एबीए लिखो। – supercat