В чем разница в atomic_load () и назначении - PullRequest
0 голосов
/ 24 мая 2019

Я работаю над проектом, который занимается множеством атомных операций. До сих пор я не знал о atomic_load() и полагался только на оператор присваивания, чтобы получить значение атомарного типа, и я не видел ошибки, за исключением такого большого количества тестирования. Эти атомарные типы изменяются несколькими процессами и потоками, а также atomic_compare_exchange_strong_explicit(), поэтому им каждый раз будет требоваться старое значение, и именно здесь я всегда делал oldValue = <Atomic_ type_variable>, и оно всегда работает нормально. Это случайно? Стоит ли использовать atomic_load ()?

1 Ответ

1 голос
/ 24 мая 2019

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.

...