2013-04-16 6 views
11

सी ++ 11 कैस आपरेशन (जैसे, atomic_compare_exchange_weak, atomic_compare_exchange_strong) दो संकेत दिए गए और एक मूल्य, यानी, इस तरह ले से कई:सी ++ 11 सीएएस संचालन दो सूचक पैरामीटर क्यों लेते हैं?

bool atomic_compare_exchange(T* pointer, T* expected,  // pseudodeclaration! 
          T desired); 

इसके विपरीत, माइक्रोसॉफ्ट, जीसीसी, और इंटेल से कैस संचालन

long InterlockedCompareExchange(long* pointer, long desired,  // Microsoft 
           long expected); 

int __sync_bool_compare_and_swap (T* pointer, T expected,   // gcc and 
            T desired);      // Intel 

क्यों सी ++ 11 कैस कार्यों दो संकेत लेते हैं और बदले में क्या दिखाई देता है की एक मूल्य के एक और अधिक परंपरागत एक सूचक और दो मानों होने के लिए: सभी एक सूचक और दो मानों ले?

+0

'__sync_bool _...' रिटर्न एक * bool *। –

+1

@ केरेरेकएसबी: हस्ताक्षर मैंने दिखाया कि मैंने इंटेल मैनुअल से कॉपी किया है। मैंने माना कि जीसीसी ने एक ही हस्ताक्षर का इस्तेमाल किया था। अब मैं देखता हूं कि यह नहीं है। – KnowItAllWannabe

उत्तर

18

सी ++ 11 रास्ता अधिक उपयोगी है: यदि एक्सचेंज विफल रहता है, तो *expected को नए, वर्तमान मूल्य में अपडेट किया गया है। परीक्षण है कि ऑपरेशन सफल रहा अधिक बोझिल है, और जीसीसी के __sync_type संस्करण के लिए डिट्टो है

T value = x.load(); 
T newvalue = frob(value); 

while (!atomic_compare_exchange(&x, &value, newvalue)) 
{ 
    newvalue = frob(value); 
} 

माइक्रोसॉफ्ट हस्ताक्षर के साथ,: यह आसान एक पाश में समारोह का उपयोग करने के लिए बनाता है। जीसीसी के __sync_bool के साथ, आपको एक्सचेंज विफल होने पर भी एक और लोड करने की आवश्यकता होती है।

2

मुझे नहीं पता कि आपके पास दोनों क्यों नहीं होंगे। मेरे उपयोग-मामले में सी ++ संस्करण कम उपयोगी है। मैं एक चर के कुछ मूल्य होने तक प्रतीक्षा करना चाहता हूं, फिर मैं इसे एक नए मान पर सेट करना चाहता हूं।

जीसीसी instrinsics के साथ:

while (!__sync_bool_compare_and_swap(&value, expected, desired)) { } 

सी ++ के साथ 11:

auto tmp = expected; 
while (!value.compare_exchange_weak(tmp,desired)) 
{ 
    tmp = expected; 
} 
संबंधित मुद्दे