2011-02-09 13 views
19

मैं अभी भी अनिश्चित हूं अगर मुझे समझ में नहीं आ रहा है या दस्तावेज़ीकरण स्पष्ट रूप से तैयार नहीं किया गया है।std :: परमाणु | तुलना_exchange_weak बनाम तुलना_exchange_strong

bool atomic_compare_exchange_weak(volatile A* object, C * expected, C desired); 
bool atomic_compare_exchange_weak(A* object, C * expected, C desired); 
bool atomic_compare_exchange_strong(volatile A* object, C * expected, C desired); 
bool atomic_compare_exchange_strong(A* object, C * expected, C desired); 
bool atomic_compare_exchange_weak_explicit(volatile A* object, C * expected, C desired, memory_order success, memory_order failure); 
bool atomic_compare_exchange_weak_explicit(A* object, C * expected, C desired, memory_order success, memory_order failure); 
bool atomic_compare_exchange_strong_explicit(volatile A* object, C * expected, C desired, memory_order success, memory_order failure); 
bool atomic_compare_exchange_strong_explicit(A* object, C * expected, C desired, memory_order success, memory_order failure); 
bool A::compare_exchange_weak(C & expected, C desired, memory_order success, memory_order failure) volatile; 
bool A::compare_exchange_weak(C & expected, C desired, memory_order success, memory_order failure); 
bool A::compare_exchange_strong(C & expected, C desired, memory_order success, memory_order failure) volatile; 
bool A::compare_exchange_strong(C & expected, C desired, memory_order success, memory_order failure); 
bool A::compare_exchange_weak(C & expected, C desired, memory_order order = memory_order_seq_cst) volatile; 
bool A::compare_exchange_weak(C & expected, C desired, memory_order order = memory_order_seq_cst); 
bool A::compare_exchange_strong(C & expected, C desired, memory_order order = memory_order_seq_cst) volatile; 
bool A::compare_exchange_strong(C & expected, C desired, memory_order order = memory_order_seq_cst); 

टिप्पणी: निम्नलिखित अंश नवीनतम मसौदा (N3126, खंड 29.6) से लिया गया है कमजोर तुलना और विनिमय संचालन नकली तौर पर विफल हो सकता है, है कि, झूठी वापसी करते हुए छोड़ने मेमोरी की सामग्री द्वारा इंगित की गई है कि ऑपरेशन ऑब्जेक्ट जैसा ही है और ऑपरेशन के बाद अपेक्षित के समान ही है। [नोट: यह नकली विफलता के कार्यान्वयन को व्यापक मशीनों की श्रेणी पर तुलना-और-विनिमय के कार्यान्वयन को सक्षम बनाता है, उदाहरण के लिए, लोडरॉक स्टोर-सशर्त मशीनें। नकली विफलता का परिणाम है कि कमजोर की लगभग सभी उपयोग तुलना-और-विनिमय लूप में होंगे।

तो, इसका क्या अर्थ है? सबसे पहले, यह 'असफल' असफल हो सकता है ?! ऐसा क्यों करता है और वे 'मई' को कैसे परिभाषित करते हैं? दूसरा, मुझे नहीं पता क्यों, लेकिन मुझे अभी भी पता नहीं है कि "_strong" और "_weak" प्रत्यय वाले कार्यों के बीच क्या अंतर है।

आशा है कि कोई भी मदद कर सके;) सर्वश्रेष्ठ संबंध।

संपादित करें: यही कारण है कि मैं libstdc में ++ पाया देता है - जैसे कार्यान्वयन (atomic_0.h):

bool compare_exchange_weak(
    __integral_type& __i1, 
    __integral_type __i2, 
    memory_order __m1, 
    memory_order __m2 
) 
{ 
    __glibcxx_assert(__m2 != memory_order_release); 
    __glibcxx_assert(__m2 != memory_order_acq_rel); 
    __glibcxx_assert(__m2 <= __m1); 
    return _ATOMIC_CMPEXCHNG_(this, &__i1, __i2, __m1); 
} 

bool compare_exchange_strong(
    __integral_type& __i1, 
    __integral_type __i2, 
    memory_order __m1, 
    memory_order __m2 
) 
{ 
    __glibcxx_assert(__m2 != memory_order_release); 
    __glibcxx_assert(__m2 != memory_order_acq_rel); 
    __glibcxx_assert(__m2 <= __m1); 
    return _ATOMIC_CMPEXCHNG_(this, &__i1, __i2, __m1); 
} 
+0

मैंने एसटीएल टैग जोड़ा, आशा है कि यह हॉवर्ड हिन्नेंट को वहां लाएगा, वह libC++ में इन्हें लागू करने पर काम कर रहा है, इसलिए उसे इसके बारे में पता होना चाहिए। –

उत्तर

7

यह साझा स्मृति स्थिरता मॉडल है कि हार्डवेयर उपकरणों के साथ क्या करना है। उन हार्डवेयर आर्किटेक्चरों के लिए जो किसी प्रकार के आराम से स्थिरता मॉडल (जैसे रिलीज सेमेन्टिक्स) को लागू करते हैं, आपके ऊपर ऊपर दिए गए मजबूत संचालन में उच्च ओवरहेड हो सकता है, और इस प्रकार विशेषज्ञ कमजोर रूपों को एल्गोरिदम लागू करने के लिए उपयोग कर सकते हैं जो उन सुसंगत स्थिरता पर भी अच्छा प्रदर्शन करते हैं आर्किटेक्चर।

अधिक जानकारी के लिए, उदाहरण देखें

http://www.hpl.hp.com/techreports/Compaq-DEC/WRL-95-7.pdf

अध्याय 12 और परिशिष्ट सी http://kernel.org/pub/linux/kernel/people/paulmck/perfbook/perfbook.html

+1

लेकिन, क्या यह स्मृति को मजबूत करने या कमजोर करने के लिए स्मृति_ऑर्डर पैरामीटर की भावना नहीं है मेमोरी ऑर्डरिंग मॉडल? – 0xbadf00d

+0

नहीं, यह हार्डवेयर द्वारा निर्दिष्ट किया गया है। वह पैरामीटर आपके एल्गोरिदम को सही तरीके से काम करने के लिए न्यूनतम ऑर्डरिंग निर्दिष्ट करता है। यह तब सुनिश्चित करने के लिए सी ++ 0x कार्यान्वयन है कि कम से कम निर्दिष्ट ऑर्डरिंग है प्रदान किया गया; दृढ़ता से आदेश दिया गया संग्रह के लिए x86 जैसे ectures, यह संभावना है कि मजबूत और कमजोर कार्यान्वयन दोनों समान हैं। – janneb

+0

सूखी, लेकिन यह अभी भी मुझे समझ में नहीं आता है। क्या स्मृति_ऑर्डर पैरामीटर और मजबूत या कमजोर विधियों के माध्यम से ऑर्डरिंग निर्दिष्ट करना अनावश्यक नहीं है? शायद यह जानने में मदद मिलेगी कि कमजोर और मजबूत तुलना_exchange के बीच मुख्य (सार) अंतर क्या है। – 0xbadf00d

25

नोट में एक सुराग देता है, LL/SC आर्किटेक्चर का जिक्र है। विकिपीडिया आलेख से:

यदि कोई अपडेट हुआ है, तो स्टोर-सशर्त विफल होने की गारंटी है, भले ही लोड-लिंक द्वारा पढ़ा गया मान बहाल हो गया हो। इस प्रकार, एक एलएल/एससी जोड़ी एक पठन से अधिक मजबूत होती है जिसके बाद एक तुलना-और-स्वैप (सीएएस) होता है, जो पुराने मान को बहाल किया गया है (एबीए समस्या देखें) अद्यतनों का पता नहीं लगाएगा।

एलएल/एससी के वास्तविक कार्यान्वयन हमेशा सफल नहीं होते हैं यदि प्रश्न में स्मृति स्थान के लिए कोई समवर्ती अपडेट नहीं हैं। एक संदर्भ स्विच, एक और लोड-लिंक, या यहां तक ​​कि (कई प्लेटफॉर्म पर) एक और लोड या स्टोर ऑपरेशन के बीच दो असाधारण घटनाओं के बीच कोई असाधारण घटनाएं, स्टोर-सशर्त को असफल रूप से असफल होने का कारण बनती हैं।

डालूँगा/एससी चिप्स compare_exchange डालूँगा/एससी के मामले में लागू किया जाएगा, जो नकली तौर पर असफल हो सकता है, इसलिए compare_exchange_strong जरूरतों अतिरिक्त भूमि के ऊपर विफलता के मामले में पुन: प्रयास करने पर

compare_exchange_strong और compare_exchange_weak प्रदान करने से प्रोग्रामर यह तय करने की अनुमति देता है कि वे लाइब्रेरी को नकली असफलताओं को संभालने के लिए चाहते हैं (इस मामले में वे compare_exchange_strong का उपयोग करेंगे या यदि वे इसे अपने कोड में संभालना चाहते हैं (इस मामले में वे compare_exchange_weak का उपयोग करेंगे)

+0

अच्छा जवाब। चर्चा करने की एक बात "विफलता के मामले में पुनः प्रयास करें" के बारे में है, क्या इसे "*** नकली *** विफलता के मामले में पुनः प्रयास करना चाहिए"? यदि विवाद के कारण यह वास्तविक विफलता है (नियत मूल्य अपेक्षित के बराबर नहीं है), 'compar_exchange_strong' को किसी भी पुनः प्रयास के तुरंत बाद' झूठी 'वापस करनी चाहिए। क्या आप सहमत हैं? –

+0

मैंने 'compar_exchange_weak' [यहां] (http://stackoverflow.com/questions/25199838/understanding-of-stdatomiccompare-exchange-weak-in-c11) के संबंध में एक प्रश्न पोस्ट किया है। क्या आप किसी ऐसे ज्ञान को साझा करना और साझा करना चाहते हैं जो आप हमारे साथ जानते हैं? धन्यवाद। –

+0

हां, मजबूत फॉर्म नकली विफलता के मामले में फिर से प्रयास करता है, न कि जब वस्तु के पास अपेक्षित मूल्य नहीं होता है। –

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