Spec-Zone.ru › C

atomic_thread_fence

Определён в заголовочном файле <stdatomic.h>
void atomic_thread_fence( memory_order order );
(начиная с C11)

Устанавливает порядок синхронизации памяти для неатомарных и атомарных доступов с порядком relaxed согласно указаниям order, не связывая их с атомарной операцией. Однако для настройки синхронизации необходима как минимум одна атомарная операция, как описано ниже.

Синхронизация между барьером и атомарной операцией

Барьер освобождения F в потоке A синхронизируется-с атомарной операцией захвата Y в потоке B, если

  • существует атомарная запись X (с любым порядком памяти),
  • Y считывает значение, записанное X (или значение, которое было бы записано последовательностью освобождения, начинающейся с X, если бы X была операцией освобождения),
  • F предшествует X в порядке выполнения в потоке A.

В этом случае все неатомарные и атомарные записи с порядком relaxed, которые предшествуют F в порядке выполнения в потоке A, будут происходить раньше всех неатомарных и атомарных чтений с порядком relaxed из тех же ячеек памяти, выполненных в потоке B после Y.

Синхронизация между атомарной операцией и барьером

Атомарная операция освобождения X в потоке A синхронизируется-с барьером захвата F в потоке B, если

  • существует атомарное чтение Y (с любым порядком памяти),
  • Y считывает значение, записанное X (или последовательностью освобождения, начинающейся с X),
  • Y предшествует F в порядке выполнения в потоке B.

В этом случае все неатомарные и атомарные записи с порядком relaxed, которые предшествуют X в порядке выполнения в потоке A, будут происходить раньше всех неатомарных и атомарных чтений с порядком relaxed из тех же ячеек памяти, выполненных в потоке B после F.

Синхронизация между барьерами

Барьер освобождения FA в потоке A синхронизируется-с барьером захвата FB в потоке B, если

  • существует атомарный объект M,
  • существует атомарная запись X (с любым порядком памяти), изменяющая M в потоке A,
  • FA предшествует X в порядке выполнения в потоке A,
  • существует атомарное чтение Y (с любым порядком памяти) в потоке B,
  • Y считывает значение, записанное X (или значение, которое было бы записано последовательностью освобождения, начинающейся с X, если бы X была операцией освобождения),
  • Y предшествует FB в порядке выполнения в потоке B.

В этом случае все неатомарные и атомарные записи с порядком relaxed, которые предшествуют FA в порядке выполнения в потоке A, будут происходить раньше всех неатомарных и атомарных чтений с порядком relaxed из тех же ячеек памяти, выполненных в потоке B после FB.

В зависимости от order эта операция

  • не имеет эффекта, если order == memory_order_relaxed
  • является барьером захвата, если order == memory_order_acquire || order == memory_order_consume
  • является барьером освобождения, если order == memory_order_release
  • является одновременно барьером захвата и барьером освобождения, если order == memory_order_acq_rel
  • является барьером захвата и освобождения с последовательной согласованностью, если order == memory_order_seq_cst

Параметры

order - порядок памяти, применяемый этим барьером

Возвращаемое значение

(нет)

Примечания

На x86 (включая x86-64) функции atomic_thread_fence не генерируют инструкции процессора и влияют только на перемещение кода на этапе компиляции, за исключением atomic_thread_fence(memory_order_seq_cst).

atomic_thread_fence задаёт более строгие ограничения синхронизации, чем атомарная операция записи с тем же memory_order. Если атомарная операция записи с освобождением не позволяет перемещать предшествующие чтения и записи за эту операцию, то atomic_thread_fence с порядком memory_order_release не позволяет перемещать предшествующие чтения и записи за все последующие записи.

Ссылки

  • Стандарт C17 (ISO/IEC 9899:2018):
    • 7.17.4.1 Функция atomic_thread_fence (стр. 204)
  • Стандарт C11 (ISO/IEC 9899:2011):
    • 7.17.4.1 Функция atomic_thread_fence (стр. 278–279)

См. также

atomic_signal_fence
(C11)
барьер между потоком и обработчиком сигнала, выполняемым в том же потоке
(функция)
Документация C++ для atomic_thread_fence

© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/c/atomic/atomic_thread_fence

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API