shared_ptr
के बूस्ट के कार्यान्वयन में, यह relaxed memory ordering to increment its reference count का उपयोग करता है। यह सुरक्षित प्रतीत होता है क्योंकि कमी का उपयोग यह सुनिश्चित करने के लिए प्राप्त होता है कि स्मृति को जारी करने से पहले किसी भी पिछले थ्रेड थ्रेड पर दिखाई दे। इस विधि सही लगता है और हर्ब SUTTERS talk on atomicsshared_ptr का libC++ का कार्यान्वयन आराम के बजाय पूर्ण मेमोरी बाधाओं का उपयोग क्यों करता है?
में प्रकट होता है libC++ के कार्यान्वयन में full memory barriers
template <class T>
inline T
increment(T& t) _NOEXCEPT
{
return __sync_add_and_fetch(&t, 1);
}
template <class T>
inline T
decrement(T& t) _NOEXCEPT
{
return __sync_add_and_fetch(&t, -1);
}
} // name
का उपयोग करता है वहाँ इस निर्णय के लिए एक कारण है? क्या उनके बीच कोई प्रदर्शन या सुरक्षा अंतर है?
[कार्यान्वयन विवरण] के अनुसार [http://en.cppreference.com/w/cpp/memory/shared_ptr), यह कहता है "थ्रेड सुरक्षा आवश्यकताओं को पूरा करने के लिए, संदर्भ काउंटर आमतौर पर बढ़े और कम हो जाते हैं std :: memory_order_relaxed के साथ std :: atomic :: fetch_add के बराबर का उपयोग कर। " मैं कथन की पुष्टि करने के लिए स्रोत ढूंढने की उम्मीद कर रहा था, लेकिन मुझे जीसीसी के लिए libC++ स्रोत कोड के ऑनलाइन दस्तावेज़ीकरण को खोजने में परेशानी हो रही है (हालांकि वे केवल Google खोज ही बेवकूफ़ हैं, शायद कोई लिंक प्रदान कर सकता है)। मुझे लगता है कि आपका लिंक एलएलवीएम के लिए है। – Suedocode
उस कोड को किसने लिखा, कब, क्यों और क्यों उन्होंने लिखा ... अगर केवल एक रास्ता पता चला। ;) –
@Aggieboy मुझे लगता है कि मैंने जो दर्पण जोड़ा है वह जीसीसी पर libC++ का स्रोत है, आप इसे '-gcc-toolchain' के साथ संकलित करते हैं। libstd ++ (जीसीसी पर डिफ़ॉल्ट मानक लाइब्रेरी) '__gnu_cxx :: __ exchange_and_add' का उपयोग करता है, जो मुझे विश्वास है कि एक पूर्ण बाधा भी है लेकिन मुझे यकीन नहीं है। ऐसा लगता है कि यह सामान्य ज्ञान है कि इसे आराम से बाधाओं के साथ कार्यान्वित किया जाना चाहिए, लेकिन मुझे लगता है कि –