#define ATOMIC_LLONG_LOCK_FREE
#define ATOMIC_CHAR16_T_LOCK_FREE
#define ATOMIC_CHAR32_T_LOCK_FREE
#define ATOMIC_WCHAR_T_LOCK_FREE
#define ATOMIC_POINTER_LOCK_FREE
Значением ATOMIC_
может быть 0, 1 или 2. Значение 0 означает, что операции над знаковыми и беззнаковыми атомарными типами, соответствующими типу
, никогда не свободны от блокировок; 1 — что операции могут быть свободны от блокировок для одних экземпляров этих типов и не свободны для других; 2 — что операции всегда свободны от блокировок. Например, если ATOMIC_INT_LOCK_FREE
равно 2, то операции над любыми экземплярами std::atomic
и std::atomic
свободны от блокировок.
Макрос ATOMIC_POINTER_LOCK_FREE
позволяет узнать, свободны ли от блокировок операции над атомарными специализациями указателя std::atomic
.
D.3.3. ATOMIC_VAR_INIT
, макрос
Макрос ATOMIC_VAR_INIT
позволяет инициализировать атомарную переменную конкретным значением.
Объявление
#define ATOMIC_VAR_INIT(value)
Макрос расширяется в последовательность лексем, которую можно использовать в выражении следующего вида для инициализации одного из стандартных атомарных типов указанным значением:
std::atomic
Указанное значение должно быть совместимо с неатомарным типом, соответствующим данной атомарной переменной, например:
std::atomic
std::string s;
std::atomic
Такая инициализация не атомарна, то есть любой доступ из другого потока к инициализируемой переменной в случае, когда инициализация не происходит-раньше этого доступа, приводит к гонке за данными и, следовательно, к неопределённому поведению.
D.3.4. std::memory_order
, перечисление
Перечисление std::memory_order
применяется для задания упорядочения доступа к памяти при выполнении атомарных операций.
typedef enum memory_order {
memory_order_relaxed, memory_order_consume,
memory_order_acquire, memory_order_release,
memory_order_acq_rel, memory_order_seq_cst
} memory_order;
Операции, помеченные элементами этого перечисления, ведут себя, как описано ниже (подробное описание упорядочения доступа к памяти см. в главе 5).
STD::MEMORY_ORDER_RELAXED
Операция не обеспечивает никаких дополнительных ограничений на упорядочение.
STD::MEMORY_ORDER_RELEASE
Операция освобождения указанной ячейки памяти. Следовательно, она синхронизируется-с операцией захвата той же ячейки памяти, которая читает сохраненное значение.
STD::MEMORY_ORDER_ACQUIRE
Операция захвата указанной ячейки памяти. Если сохраненное значение было записано операцией освобождения, то сохранение синхронизируется-с этой операцией.
STD::MEMORY_ORDER_ACQ_REL
Операция чтения-модификации-записи. Ведет себя так, как будто одновременно заданы ограничения std::memory_order_acquire
и std::memory_order_release
для доступа к указанной ячейке памяти.
STD::MEMORY_ORDER_SEQ_CST
Операция является частью цепочки последовательно согласованных операций, на которой определено полное упорядочение. Кроме того, если это сохранение, то оно ведет себя как операция с ограничением std::memory_order_release
, если загрузка — то как операция с ограничением std::memory_order_acquire
, а если это операция чтения-модификации-записи, то она ведет себя как операция с обоими ограничениями std::memory_order_acquire
и std::memory_order_release
.
STD::MEMORY_ORDER_CONSUME
Операция потребления указанной ячейки памяти.
D.3.5. std::atomic_thread_fence
, функция
Функция std::atomic_thread_fence()
вставляет в программу «барьер», чтобы принудительно обеспечить упорядочение доступа к памяти со стороны нескольких операций.
extern "С" void atomic_thread_fence(std::memory_order order);