2016-04-07 6 views
6

मैं सीखने की कोशिश कर रहा हूं और मल्टीथ्रेडिंग को समझने में बेहतर हूं, लेकिन मैं लेट-एंड-एड जैसे परमाणु कार्यों के व्यवहार पर लटका हुआ हूं। Fetch-and-add के विशिष्ट मामले में, यह मेरी समझ है कि एक मूल्य (मान लीजिए एक्स जो वर्तमान में 5 बराबर है) को वृद्धि मूल्य से जोड़ा जाता है (मान लें 3), परिणामस्वरूप योग (8) x के लिए लिखा गया है स्मृति में जगह, अभी तक पुराना मान (5) वापस आ गया है।फ़ेच-एंड-एड जैसे परमाणु संचालन क्यों परिवर्तनीय के पुराने मान को बदलते हैं?

विभिन्न स्थानों में ऐसे कई अन्य कार्य हैं (जैसे ओपनजीएल के परमाणु कार्यों, जावा के परमाणु संकेतक, और कई अन्य क्षेत्रों) जो इस तरह व्यवहार करते हैं। लेकिन मुझे समझ में नहीं आता है कि क्यों कोड में एक जगह स्मृति को लिखना चाहती है और फिर भी वह मान वापस लौटाती है जिसे वह पहले स्थान पर संशोधित करना चाहता था। क्या कोई इस पर प्रकाश डालने में मदद कर सकता है?

उत्तर

2

सेर्गेई के जवाब पर विस्तार करने के लिए ...

मैं देखो लाने और जोड़ने के एक सेमाफोर को कुछ इसी तरह हो, fetch-and-add कॉल को छोड़कर सब कुछ एक परमाणु ऑपरेशन बनाता है। यहां एक एल्गोरिदम का एक उदाहरण दिया गया है जो मूल मान का उपयोग दिखाता है: http://research.omicsgroup.org/index.php/Ticket_lock

+0

यह पढ़ने के लिए एक अविश्वसनीय रूप से उपयोगी लेख था। मदद और उदाहरण के लिए धन्यवाद, सर्गेई, और डिमिटार! – hashahid

3

उत्तर बहुत आसान है। परमाणु कार्यों की प्रकृति यह है कि निष्पादन के समय वे वास्तविक मूल्य को संशोधित (इस मामले में वृद्धि) संशोधित करते हैं जो आपके कोड के रूप में मूल्य से भिन्न हो सकता है।

उदाहरण:

x = 5; // x is global 
y = atomically_increment(x); 
// what is y? 

अब, अगर एक्स 9.

1

Fetch- करने के लिए 6 5 से परिवर्तित करने की सही से पहले वेतन वृद्धि वास्तव में जगह ले ली, वाई 6 के बराबर हो सकता है, और एक्स हुआ और निर्देश या संचालन जोड़ें (जैसे x86 के XADD) आपको सीएएस लूप करने और अपेक्षित प्रारंभिक मूल्य प्रदान करने की परेशानी से बचाता है।

हालांकि इसका मतलब यह भी है कि आपके कोड में, fetch-and-add सफल होने के बाद, आप नहीं जानते कि आपकी वृद्धि में क्या वृद्धि हुई और भारी विवाद के तहत, मूल्य लाने और बस जोड़ने से पहले मूल्य को पढ़ना यह अभी भी सच से बहुत दूर हो सकता है। यही कारण है कि परमाणु fetch-and-add के परिणामस्वरूप पुराने या नए मूल्य को वापस करना बहुत उपयोगी है।

उदाहरण के तौर पर, Aeron यह निर्धारित करने के लिए fetch-and-add द्वारा दिए गए मान का उपयोग करता है कि यह अपने बफर को घुमाएगा या नहीं (https://youtu.be/eKVpea51tvo?t=31m54s देखें)।

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