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)
См. также
|
(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