32 Atomic operations library [atomics]

32.9 Fences [atomics.fences]

В этом разделе представлены примитивы синхронизации, называемые 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