На информационной странице GCC , это действительно атомарно, но это не базовая атомарная выборка и сохранение.
(это вырезано из руководства 4.4, поэтому другой номер раздела)
5.48 Встроенные функции для доступа к атомарной памяти
(...)
TYPE __sync_fetch_and_add (TYPE *ptr, TYPE value, ...)
TYPE __sync_fetch_and_sub (TYPE *ptr, TYPE value, ...)
TYPE __sync_fetch_and_or (TYPE *ptr, TYPE value, ...)
TYPE __sync_fetch_and_and (TYPE *ptr, TYPE value, ...)
TYPE __sync_fetch_and_xor (TYPE *ptr, TYPE value, ...)
TYPE __sync_fetch_and_nand (TYPE *ptr, TYPE value, ...)
TYPE __sync_add_and_fetch (TYPE *ptr, TYPE value, ...)
TYPE __sync_sub_and_fetch (TYPE *ptr, TYPE value, ...)
TYPE __sync_or_and_fetch (TYPE *ptr, TYPE value, ...)
TYPE __sync_and_and_fetch (TYPE *ptr, TYPE value, ...)
TYPE __sync_xor_and_fetch (TYPE *ptr, TYPE value, ...)
TYPE __sync_nand_and_fetch (TYPE *ptr, TYPE value, ...)
bool __sync_bool_compare_and_swap (TYPE *ptr, TYPE oldval TYPE newval, ...)
TYPE __sync_val_compare_and_swap (TYPE *ptr, TYPE oldval TYPE newval, ...)
__sync_synchronize (...)
TYPE __sync_lock_test_and_set (TYPE *ptr, TYPE value, ...)
void __sync_lock_release (TYPE *ptr, ...)
Они, очевидно, взяты из справочного руководства по Intel Itanium, но GCC реализует их на любом процессоре, которым они могут быть (и предупреждает, если вы используете один на процессоре, который этого не делает, затем использует неатомарную версию). Функция, которую вы отметили, на самом деле представляет собой расширенный барьер памяти (или критическую область): барьер устанавливается __sync_lock_test_and_set
, а освобождается __sync_lock_release
.
Если вы ищете базовую атомарную выборку и установку, это, вероятно, __sync_val_compare_and_swap
, хотя в большинстве случаев вы захотите использовать одну из более конкретных версий.