इस प्रश्न के समान शीर्षक वाले पेपर में , लेखक केवल एकल-शब्द CAS का उपयोग करके एक गैर - रेखीय बहु-शब्द CAS संचालन का निर्माण करने का वर्णन करते हैं। वे सबसे पहले डबल-तुलना-एकल-स्वैप ऑपरेशन - आरडीसीएसएस, इस प्रकार प्रस्तुत करते हैं:
word_t RDCSS(RDCSSDescriptor_t *d) {
do {
r = CAS1(d->a2, d->o2, d);
if (IsDescriptor(r)) Complete(r);
} while (IsDescriptor(r));
if (r == d->o2) Complete(d); // !!
return r;
}
void Complete(RDCSSDescriptor_t *d) {
v = *(d->a1);
if (v == d->o1) CAS1(d->a2, d, d->n2);
else CAS1(d->a2, d, d->o2);
}
RDCSSDescriptor_t
निम्नलिखित क्षेत्रों के साथ एक संरचना कहां है:
a1
- पहली शर्त का पताo1
- पहले पते पर अपेक्षित मूल्यa2
- दूसरी स्थिति का पताo2
- दूसरे पते पर अपेक्षित मूल्यn2
- दूसरे पते पर लिखा जाने वाला नया मान
यह वर्णनकर्ता आरडीसीएस ऑपरेशन शुरू करने वाले धागे में एक बार बनाया और शुरू किया जाता है - फ़ंक्शन में पहला CAS1 RDCSS
सफल होने तक किसी अन्य धागे का कोई संदर्भ नहीं होता है, जिससे वर्णनकर्ता पहुंच में नहीं आता (या कागज की शब्दावली में सक्रिय होता है)।
एल्गोरिथ्म के पीछे का विचार निम्नलिखित है - एक वर्णनकर्ता के साथ दूसरी मेमोरी लोकेशन को यह कहना कि आप क्या करना चाहते हैं। फिर, यह देखते हुए कि विवरणक मौजूद है, यह देखने के लिए कि क्या इसका मान बदल गया है, पहले मेमोरी लोकेशन की जाँच करें। यदि यह नहीं है, तो नए मान के साथ वर्णनकर्ता को दूसरे मेमोरी स्थान पर बदलें। अन्यथा, दूसरे मेमोरी लोकेशन को पुराने मान पर सेट करें।
लेखक यह नहीं समझाते हैं कि !!
टिप्पणी के साथ लाइन कागज के भीतर क्यों आवश्यक है। यह मुझे लगता है कि फ़ंक्शन CAS1
में निर्देश Complete
इस चेक के बाद हमेशा विफल रहेंगे, बशर्ते कि कोई समवर्ती संशोधन न हो। और अगर चेक और CAS के बीच एक समवर्ती संशोधन था Complete
, तो चेक करने वाला धागा अभी भी अपनी CAS के साथ विफल होना चाहिए Complete
, क्योंकि समवर्ती संशोधन में एक ही विवरणक का उपयोग नहीं करना चाहिए d
।
मेरा प्रश्न है: समारोह में जाँच कर सकते हैं RDCSSS
, if (r == d->o2)...
, RDCSS अभी भी एक डबल तुलना, एकल स्वैप अनुदेश जो है के शब्दों को बनाए रखने के साथ छोड़ देना linearizable और ताला मुक्त ? ( !!
टिप्पणी के साथ लाइन )
यदि नहीं, तो क्या आप उस परिदृश्य का वर्णन कर सकते हैं जहां यह रेखा वास्तव में शुद्धता सुनिश्चित करने के लिए आवश्यक है?
धन्यवाद।