मुझे जीसीसी के बिल्टिन परमाणु संचालन के बारे में पता है: 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;
}
अगर मैं गलत हूं तो मुझे रोकें, लेकिन आपका "स्टोर" फ़ंक्शन वास्तव में एक स्टोर नहीं है क्योंकि यह पुराना मान देता है (इसलिए यह सीएएस के बहुत करीब है)। – claf
यह वास्तव में एक "एक्सचेंज" - एक नया मूल्य संग्रहित करता है और यदि आप इसे चाहते हैं तो पिछले मान को वापस कर रहा है। –
मुझे पता चला है कि इस लोड कार्यान्वयन में कोई समस्या है: इसे केवल पढ़ने योग्य स्मृति पर उपयोग नहीं किया जा सकता है। – Mabus