Jestem świadomy wbudowanych operacji atomowych GCC: http://gcc.gnu.org/onlinedocs/gcc-4.3.2/gcc/Atomic-Builtins.htmlLepszy sposób na wdrożenie ogólnego ładunku atomowego lub magazynu w GCC?
Lista ta nie obejmuje jednak bardzo prostych operacji, takich jak ładowanie i przechowywanie. mogłaby wdrożyć je na ograniczoną architektur z montażem inline (w rzeczywistości dla wielu jak x86 będą w zasadzie tylko regularne mov'S), ale to nie ma lepszego sposobu, w ogólnym przypadku, niż coś takiego:
// 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;
}
Zatrzymaj mnie, jeśli się mylę, ale funkcja "sklepu" nie jest tak naprawdę sklepem, ponieważ zwraca starą wartość (więc jest bardzo blisko CAS). – claf
To naprawdę "wymiana" - przechowywanie nowej wartości i zwracanie poprzedniej wartości, jeśli chcesz. –
Odkryłem, że ta implementacja obciążenia ma problem: nie może być używana w pamięci tylko do odczytu. – Mabus