2015-04-11 11 views
5

में सीएएस को कैसे कार्यान्वित करें मैं जानना चाहता हूं कि C++ 11 में compar_and_swap को कैसे कार्यान्वित किया जाए। यहाँ मैं क्या करने की कोशिश की है:सी ++ 11

template<typename T> 
T compare_and_swap(atomic<T>& reg,T newVal) 
{ 
    bool success = false; 
    T oldVal; 
    do 
    { 
     oldVal = reg.load(); 
     success = reg.compare_exchange_weak(oldVal,newVal); 
    }while(!success); 
    return oldVal; 
} 

इस लागू करने के लिए एक बेहतर तरीका है?

+0

आपको http://codereview.stackexchange.com/ – Raistmaj

+4

तुलना में पूछने की कोशिश करनी चाहिए तुलना_exchange पहले ही स्वैप करता है, आपको बिल्कुल अपने रैपर की आवश्यकता नहीं है। – Mat

+0

@ मेट नकारात्मक, तुलना_ विनिमय कुछ निश्चित स्थिति में निश्चित रूप से कोड लाइन जोड़ देगा। ऐसी स्थिति जो तुलना_and_swap की semantics की आवश्यकता है कई बार – AntiMoron

उत्तर

0

यह कैसे मैं यह कर देगी:

//untested code 
template<typename T> 
T compare_and_swap(atomic<T>& reg,T newVal) 
{ 
    oldVal = atomic_load(reg); 
    while(!atomic_compare_exchange_weak(&reg, &oldVal, newVal)); 
    return oldVal; 
} 

विनिमय समारोह की तुलना अगर यह विफल oldval मूल्य अद्यतन करेगा। इसलिए इसे दोहराने की कोई ज़रूरत नहीं है।

जैसा कि आप देख सकते हैं कि मैं स्पष्ट परमाणु संचालन का उपयोग करना पसंद करता हूं। ऐसा इसलिए है क्योंकि पूर्ण व्यक्ति हमेशा लागू नहीं होते हैं। जैसा कि हर्ब सटर here द्वारा समझाया गया है (शेष वीडियो आपको भी रूचि दे सकता है :))।

एक सकारात्मक अनावश्यक विचार के रूप में मैं इस समारोह का उपयोग गैर trivially copyable प्रकारों के साथ चेतावनी देना चाहता हूं। या 'सामान्य' पॉइंटर्स। साझा पॉइंटर्स सामान्य रूप से ठीक हैं :)।