2009-05-02 13 views
10

मुझे जीसीसी के बिल्टिन परमाणु संचालन के बारे में पता है: http://gcc.gnu.org/onlinedocs/gcc-4.3.2/gcc/Atomic-Builtins.htmlजीसीसी में एक सामान्य परमाणु भार या स्टोर को लागू करने का बेहतर तरीका?

लेकिन इस सूची में लोड और स्टोर जैसे बहुत ही सरल संचालन शामिल नहीं हैं। मैं (x86 वे मूल रूप से बस नियमित mov के लिए किया जाएगा जैसे कई के लिए वास्तव में) इनलाइन विधानसभा के साथ सीमित आर्किटेक्चर पर इन लागू कर सकता है, लेकिन वहाँ कुछ इस तरह से सामान्य स्थिति में कोई बेहतर तरीका है:

// returns the value at ptr 
void *atomic_load_ptr(void **ptr) 
{ 
    return __sync_fetch_and_add(ptr, 0); 
} 

// returns old value int ptr after setting it to newval 
void *atomic_store_ptr(void **ptr, void *newval) 
{ 
    void *oldval = atomic_load_ptr(ptr) 
    void *oldval2; 
    do { 
     oldval2 = oldval; 
    } while ((oldval = __sync_val_compare_and_swap(ptr, oldval, newval)) != oldval2); 
    return oldval; 
} 
+0

अगर मैं गलत हूं तो मुझे रोकें, लेकिन आपका "स्टोर" फ़ंक्शन वास्तव में एक स्टोर नहीं है क्योंकि यह पुराना मान देता है (इसलिए यह सीएएस के बहुत करीब है)। – claf

+0

यह वास्तव में एक "एक्सचेंज" - एक नया मूल्य संग्रहित करता है और यदि आप इसे चाहते हैं तो पिछले मान को वापस कर रहा है। –

+0

मुझे पता चला है कि इस लोड कार्यान्वयन में कोई समस्या है: इसे केवल पढ़ने योग्य स्मृति पर उपयोग नहीं किया जा सकता है। – Mabus

उत्तर

2

आप कर सकते थे test_and_set के साथ निम्न स्तर mutex लागू करें। लोड फ़ंक्शन एक अच्छा आईएमओ है, लेकिन आप स्टोर को

while ((oldval = __sync_val_compare_and_swap(ptr, oldval, newval)) != oldval2); 

त्रुटियों को रोकने के लिए test_and_set का उपयोग करना चाहिए।

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