Что делает Memory_order::acquire для операции чтения-изменения-записи?

Другой разработчик показал мне следующий фрагмент:

std::atomic_flag lock;
// ...
while (lock.test_and_set(std::memory_order::acquire)) {}
// critical section
lock.clear(std::memory_order::release);

Я не понимаю, что здесь означает указание acquire в качестве порядка памяти. Это неявно тот же порядок, что и acq_rel, или это acquire для операции загрузки и seq_cst (по умолчанию) для операции сохранения в рамках этой операции чтения-изменения-записи?

std::atomic_flag::test_and_set не имеет предварительных условий, и просто сказано, что:

На память влияет значение order.

Это ничего не проясняет для меня. Что, если order — это acquire? Как тогда пострадает магазин, а?

За пределами формализма C++ рассмотрим машину LL/SC, такую ​​​​как ARMv8.0: на стороне загрузки используется ldaxr (эксклюзивная загрузка приобретения), но на стороне хранилища просто нужна атомарность, а не упорядочивание, поэтому stxr не stlxr. godbolt.org/z/M95EfsMd6 . Связанный: Для целей упорядочения атомарное чтение-изменение-запись — это одна операция или две?

Peter Cordes 25.06.2024 23:49
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
2
1
81
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Порядки памяти описываются (только) с точки зрения их влияния на синхронизацию и последовательность.

Атомарная операция A, выполняющая операцию освобождения атомарного объекта M, синхронизируется с атомарной операцией B, которая выполняет операцию получения M и получает свое значение из любого побочного эффекта в последовательности освобождения, возглавляемой A.

Влияние acquire на «тестовую» часть test_and_set очевидно. Что касается его влияния на «установочную» часть? Ну, у него его нет. Как и в случае с relaxed, стандарт просто не предоставляет никаких полезных гарантий. Итак, это эквивалентно чему-то вроде memory_order::acq_relaxed. Компилятор может перемещать чтение/запись вниз за test_and_set, но не вверх.

В стандарте это можно прочитать так: это операция получения, но, по упущению, это не операция освобождения (поскольку об этом никогда не говорится) и она не является последовательной последовательностью.

Nate Eldredge 26.06.2024 06:54

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