Я знаю о встроенных атомных операциях GCC: 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;
}