В этом разделе представлены примитивы синхронизации, называемые fences. Ограничения могут иметь семантику приобретения, семантику выпуска или и то, и другое. Забор с семантикой приобретения называется acquire fence. Забор с семантикой выпуска называется файлом release fence.
Ограничение выпуска A синхронизируется с ограничением получения, B если существуют атомарные операции, X и Yоба они работают с некоторым атомарным объектом M, таким, который A упорядочивается раньше X, X модифицируется M, Y упорядочивается раньше Bи Y считывает значение, записанное X или значение, записанное любым побочным эффектом в Гипотетическая последовательность выпуска X могла бы начаться, если бы это была операция выпуска.
Ограничение выпуска A синхронизируется с атомарной операцией, B которая выполняет операцию получения на атомарном объекте, M если существует такая атомарная операция X , которая A упорядочена раньше X, X изменяет Mи B считывает значение, записанное X или значение, записанное любым побочным эффектом в гипотетической последовательности выпуска. X возглавил бы, если бы это была операция по освобождению.
Атомарная операция , A которая является операцией выпуска на атомном объекте M синхронизируется с приобретает забор , B если существует некоторая атомарная операция X на M таким образом, что X секвенируют до того, B и считывает значение , написанное A или значение , записанное с помощью какого - либо побочного эффекта в последовательности высвобождения во главе A.
extern "C" void atomic_thread_fence(memory_order order) noexcept;
Effects: В зависимости от значения 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.
extern "C" void atomic_signal_fence(memory_order order) noexcept;
Effects: Эквивалентно atomic_thread_fence(order), за исключением того, что результирующие ограничения порядка устанавливаются только между потоком и обработчиком сигнала, выполняемым в одном потоке.
[ Note: atomic_signal_fence может использоваться для указания порядка, в котором действия, выполняемые потоком, становятся видимыми для обработчика сигнала. Оптимизация компилятора и изменение порядка загрузки и сохранения запрещены таким же образом, как и с atomic_thread_fence, но инструкции аппаратного ограничения, atomic_thread_fence которые должны были быть вставлены, не выдаются. ] — end note