2015-01-28 12 views
24

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 

का उपयोग करता है वहाँ इस निर्णय के लिए एक कारण है? क्या उनके बीच कोई प्रदर्शन या सुरक्षा अंतर है?

+1

[कार्यान्वयन विवरण] के अनुसार [http://en.cppreference.com/w/cpp/memory/shared_ptr), यह कहता है "थ्रेड सुरक्षा आवश्यकताओं को पूरा करने के लिए, संदर्भ काउंटर आमतौर पर बढ़े और कम हो जाते हैं std :: memory_order_relaxed के साथ std :: atomic :: fetch_add के बराबर का उपयोग कर। " मैं कथन की पुष्टि करने के लिए स्रोत ढूंढने की उम्मीद कर रहा था, लेकिन मुझे जीसीसी के लिए libC++ स्रोत कोड के ऑनलाइन दस्तावेज़ीकरण को खोजने में परेशानी हो रही है (हालांकि वे केवल Google खोज ही बेवकूफ़ हैं, शायद कोई लिंक प्रदान कर सकता है)। मुझे लगता है कि आपका लिंक एलएलवीएम के लिए है। – Suedocode

+1

उस कोड को किसने लिखा, कब, क्यों और क्यों उन्होंने लिखा ... अगर केवल एक रास्ता पता चला। ;) –

+0

@Aggieboy मुझे लगता है कि मैंने जो दर्पण जोड़ा है वह जीसीसी पर libC++ का स्रोत है, आप इसे '-gcc-toolchain' के साथ संकलित करते हैं। libstd ++ (जीसीसी पर डिफ़ॉल्ट मानक लाइब्रेरी) '__gnu_cxx :: __ exchange_and_add' का उपयोग करता है, जो मुझे विश्वास है कि एक पूर्ण बाधा भी है लेकिन मुझे यकीन नहीं है। ऐसा लगता है कि यह सामान्य ज्ञान है कि इसे आराम से बाधाओं के साथ कार्यान्वित किया जाना चाहिए, लेकिन मुझे लगता है कि –

उत्तर

25

क्योंकि जब मैंने उस कोड को लिखा था, तो कंपाइलर (क्लैंग) ने अभी तक सी ++ 11 परमाणुओं को लागू नहीं किया था। और मैं इसे साफ करने के लिए कभी वापस नहीं आया।

यहां कुछ भी सूक्ष्म नहीं है। :-)

+15

अंत में, परमाणु से संबंधित एक उत्तर जो मैं समझता हूं! –

+0

हां, मुझे अभी "एक पास नहीं हुआ" मिला जब यह जवाब मेरी समीक्षाओं को "ऑडिट" करने के लिए दिखाया गया था ... मैंने इसे स्पैम के रूप में चिह्नित किया था, यह सोचकर कि कोई प्रतिनिधि नहीं था (यह _real_ उपयोगकर्ता नहीं दिखा रहा था) लिखित कोड होने की बेहद असंभव थी, अकेले एक पूरी लाइब्रेरी दें, कि कोई और अब पूछ रहा था :- डी –

+0

पहली बार, मैंने सोचा कि यह एक बुरा आत्म-जवाब (विशेष रूप से स्माइली) था। मैं ऑडिट के लिए गार्ड पर था, इसलिए मैंने पास किया, लेकिन यह एक महान ऑडिट विकल्प नहीं है। –

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