foo = atomic_var
- это просто сокращенный синтаксис для foo = atomic_load(&atomic_var);
, который сам по себе является сокращением для foo = atomic_load_explicit(&atomic_var, memory_order_seq_cst);
У есть вариант использования, когда выхотите использовать порядок более слабый, чем по умолчанию seq_cst
.
Основная причина явного использования atomic_load
в вашем исходном коде, вероятно, состоит в том, чтобы напомнить читателям, что переменная или указатель равен атомное.Или, может быть, как часть макроса, использование atomic_load(&(macro_input))
создаст ошибку времени компиляции для неатомного указателя.
Как «универсальная» функция, вы не можете взять нормальный указатель на функцию
Его существование может быть просто для того, чтобы упростить написание языкового стандарта и объяснить все в терминах функций.
Это не факт присваивание это ключ здесь, он оценивает атомарную переменную в контексте значения rvalue (считывая ее значение как часть выражения, как вы обычно находите в правой части =
).printf("%d\n", my_atomic_var);
также эквивалентно atomic_load
.
И кстати, то же самое относится к atomic_var = foo;
, точно так же, как atomic_store_explicit
с mo_seq_cst
.Здесь это - это присваивание, которое является ключевым.
Другие типы lvalue-ссылок на атомарную переменную отличаются, например read-modify-write atomic_var++
эквивалентно atomic_fetch_add
.