2012-11-05 11 views
13
this उपसर्ग std::atomic<T>::operator++ एक T रिटर्न के अनुसार

, तो यह कोड केवल v एक बार वृद्धि कर देता है:क्या std :: atomic :: ऑपरेटर ++ वास्तव में मूल्य से वापस आ जाता है?

template<class T> void addTwo(std::atomic<T>& v) { 
    ++(++v); 
} 
इसके अलावा

, std::atomic<T>::operator=apparently रिटर्न एक T, इसलिए इस कोड गलत सूचक है कि एक अस्थायी T को इंगित करने के लिए इस्तेमाल dereferences:

template<class T> 
void setOneThenTwo(std::atomic<T>& v) { 
    auto ptr = &(v = 1); 
    *ptr = 2; 
} 

मैं निश्चित रूप से यह सुझाव नहीं दे रहा हूं कि ये कोड पैटर्न अच्छे अभ्यास हैं, हालांकि यह बेहद आश्चर्यजनक टी है ओ मुझे लगता है कि std::atomic उन्हें तोड़ देता है। *this के संदर्भ को वापस करने के लिए मैं हमेशा operator= और उपसर्ग operator++ की अपेक्षा करता हूं।

प्रश्न: वापसी प्रकार के बारे में cppreference यहीं है, और यदि हां, वहाँ std::atomic व्यवहार करने के लिए एक अच्छा कारण की तुलना में अलग है में निर्मित इस संबंध में प्रकार?

+0

यदि 'ऑपरेटर =' 'टी' देता है, तो' & (v = 1) 'को संकलित भी नहीं करना चाहिए, है ना? –

+0

@ आर। मार्टिनिन्हो फर्नांडीस: क्योंकि यह एक रावल अस्थायी है? –

+0

क्या यह एक लाभार्थी लौटाता है? यदि नहीं, तो दूसरा ++ संकलित नहीं होगा, इसलिए कम से कम आपको छोटी गाड़ी व्यवहार से बचाया जाएगा यदि आप उम्मीद करते हैं कि wrok। – CashCow

उत्तर

20

अगर operator++ एक संदर्भ लौट आए, यह T जिस स्थिति में आप एक अतिरिक्त load करने के लिए वर्तमान मूल्य प्राप्त करने की आवश्यकता होगी के लिए नहीं std::atomic<T> के लिए एक संदर्भ हो गया होता।

आप एक डीबीएमएस मिल गया है और आप अब operator++ रिटर्न std::atomic<T>& कि मामला है जब में सोच भी एक 'autoincrement' फ़ील्ड

बनाए रखने के लिए operator++ retuning T साथ आप इस

class AutoIncrement 
{ 
public: 
    AutoIncrement() : current (0) {} 

    unsigned int next() 
    { 
     return ++current; 
    } 

private: 
    std::atomic<unsigned int> current; 
}; 

कर सकते हैं की जरूरत है कल्पना कीजिए आप return ++current करते हैं, यह दो चीजें करेगा

  1. परमाणु री डी-संशोधित-लिखना
  2. परमाणु भार

वे दो पूरी तरह से स्वतंत्र संचालन कर रहे हैं। यदि अन्य थ्रेड next को आपके बीच में कॉल करता है तो आपके ऑटोइनक्रिकमेंट फ़ील्ड के लिए गलत मान मिलेगा!

+4

+1।संक्षेप में ऐसा इसलिए है क्योंकि परमाणु (नए मूल्य में वृद्धि और वापसी) (परमाणु वृद्धि) से अधिक उपयोगी है और (परमाणु वस्तु के संदर्भ को वापस कर दें), कि डिजाइनरों को लगता है कि यह थोड़ा आश्चर्यजनक वापसी प्रकार को औचित्य देता है। –

+0

कृपया अपने उत्तरों को एक संपादन के साथ बर्बाद न करें। यह वापस लुढ़का गया है। –

2

[C++11: 29.6.5/32] और [C++11: 29.6.5/10] के अनुसार, हाँ, cppreference.com इस संबंध में सही है।

मैं आपको बताने के लिए योग्य नहीं हूं।

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