मैं अभी भी अनिश्चित हूं अगर मुझे समझ में नहीं आ रहा है या दस्तावेज़ीकरण स्पष्ट रूप से तैयार नहीं किया गया है।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);
}
मैंने एसटीएल टैग जोड़ा, आशा है कि यह हॉवर्ड हिन्नेंट को वहां लाएगा, वह libC++ में इन्हें लागू करने पर काम कर रहा है, इसलिए उसे इसके बारे में पता होना चाहिए। –