Атомный тест и набор gcc - это то же самое, что и атомарная операция извлечения и сохранения?

В описании блокировки MCS я наткнулся на атомарную инструкцию "получить и сохранить".

Из того, что я понял, это атомарно записывает значение в ячейку памяти и возвращает первоначальное значение этой ячейки памяти, это правильно?

И это атомная встроенная GCC,

   __sync_lock_test_and_set

так же, как атомная выборка и магазин?

1 ответ

Согласно информационной странице 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 хотя в большинстве случаев вы захотите использовать одну из более конкретных версий.

Другие вопросы по тегам