<atomic> 函数

atomic_compare_exchange_strong
atomic_compare_exchange_strong_explicit
atomic_compare_exchange_weak
atomic_compare_exchange_weak_explicit
atomic_exchange
atomic_exchange_explicit
atomic_fetch_add
atomic_fetch_add_explicit
atomic_fetch_and
atomic_fetch_and_explicit
atomic_fetch_or
atomic_fetch_or_explicit
atomic_fetch_sub
atomic_fetch_sub_explicit
atomic_fetch_xor
atomic_fetch_xor_explicit
atomic_flag_clear
atomic_flag_clear_explicit
atomic_flag_test_and_set
atomic_flag_test_and_set_explicit
atomic_init
atomic_is_lock_free
atomic_load
atomic_load_explicit
atomic_signal_fence
atomic_store
atomic_store_explicit
atomic_thread_fence
kill_dependency

atomic_compare_exchange_strong

执行原子比较和交换操作。

template <class Ty>
inline bool atomic_compare_exchange_strong(
    volatile atomic<Ty>* Atom,
    Ty* Exp,
    Value) noexcept;

template <class Ty>
inline bool atomic_compare_exchange_strong(
    atomic<Ty>* Atom,
    Ty* Exp,
    Ty Value) noexcept;

参数

Atom
指向存储类型 Ty 值的 atomic 对象的指针。

Exp
指向类型 Ty 的值的指针。

Value
一个 Ty 类型的值。

返回值

如果值相等,则为 true;否则为 false

注解

此方法使用隐式 memory_order.memory_order_seq_cst 参数执行原子比较和交换操作。 有关详细信息,请参阅 atomic_compare_exchange_strong_explicit

atomic_compare_exchange_strong_explicit

执行 atomic compare and exchange 操作。

template <class T>
inline bool atomic_compare_exchange_strong_explicit(
    volatile atomic<Ty>* Atom,
    Ty* Exp,
    Ty Value,
    memory_order Order1,
    memory_order Order2) noexcept;

template <class Ty>
inline bool atomic_compare_exchange_strong_explicit(
    atomic<Ty>* Atom,
    Ty* Exp,
    Ty Value,
    memory_order Order1,
    memory_order Order2) noexcept;

参数

Atom
指向存储类型 Ty 值的 atomic 对象的指针。

Exp
指向类型 Ty 的值的指针。

Value
一个 Ty 类型的值。

Order1
第一个 memory_order 参数。

Order2
第二个 memory_order 参数。 Order2 的值不能为 memory_order_releasememory_order_acq_rel,它不能比 Order1 的值更强。

返回值

如果值相等,则为 true;否则为 false

注解

atomic compare and exchange operation 比较 Atom 指向的存储在对象中的值与 Exp 所指向的值。 如果这些值相等,将会使用读取-修改-写入操作将 Atom 所指向的存储在对象中的值替换为 Value,并应用 Order1 指定的内存顺序约束。 如果这些值不相等,该操作会将 Exp 所指向的值替换为 Atom 所指向的存储在对象中的值,并应用 Order2 指定的内存顺序约束。

atomic_compare_exchange_weak

执行弱原子比较和交换操作。

template <class Ty>
inline bool atomic_compare_exchange_strong(
    volatile atomic<Ty>* Atom,
    Ty* Exp,
    Ty Value) noexcept;

template <class Ty>
inline bool atomic_compare_exchange_strong(
    atomic<Ty>* Atom,
    Ty* Exp,
    Ty Value) noexcept;

参数

Atom
指向存储类型 Ty 值的 atomic 对象的指针。

Exp
指向类型 Ty 的值的指针。

Value
一个 Ty 类型的值。

返回值

如果值相等,则为 true;否则为 false

备注

此方法执行具有隐式 memory_order.memory_order_seq_cst 参数的弱原子比较和交换操作。 有关详细信息,请参阅 atomic_compare_exchange_weak_explicit

atomic_compare_exchange_weak_explicit

执行弱原子比较和交换操作。

template <class Ty>
inline bool atomic_compare_exchange_weak_explicit(
    volatile atomic<Ty>* Atom,
    Ty* Exp,
    Ty Value,
    memory_order Order1,
    memory_order Order2) noexcept;

template <class Ty>
inline bool atomic_compare_exchange_weak_explicit(
    atomic<Ty>* Atom,
    Ty* Exp,
    Ty Value,
    memory_order Order1,
    memory_order Order2) noexcept;

参数

Atom
指向存储类型 Ty 值的 atomic 对象的指针。

Exp
指向类型 Ty 的值的指针。

Value
一个 Ty 类型的值。

Order1
第一个 memory_order 参数。

Order2
第二个 memory_order 参数。 Order2 的值不能为 memory_order_releasememory_order_acq_rel,也不能比 Order1 的值更强。

返回值

如果值相等,则为 true;否则为 false

注解

atomic compare and exchange operation 的强弱风格都保证当预期值和当前值不相等时不会存储新值。 强风格保证在预期值和当前值相等时存储新值。 弱风格有时可能返回 false,并且不存储新值,即使当前值和预期值相等。 换句话说,该函数将返回 false,但稍后对预期值的检查可能会显示它没有更改,因此应该将其视为相等。

atomic_exchange

使用 Value 替换存储的值 Atom

template <class T>
inline Ty atomic_exchange(volatile atomic<Ty>* _Atom, Ty Value) noexcept;

template <class Ty>
inline T atomic_exchange(atomic<Ty>* Atom, Ty Value) noexcept;

参数

Atom
指向存储类型 Ty 值的 atomic 对象的指针。

Value
一个 Ty 类型的值。

返回值

交换前 Atom 的存储值。

备注

atomic_exchange 函数执行读取-修改-写入操作,使用 memory_order.memory_order_seq_cst 将存储在 Atom 中的值与 Value 交换。

atomic_exchange_explicit

Atom 的存储值替换为 Value

template <class Ty>
inline Ty atomic_exchange_explicit(
    volatile atomic<Ty>* Atom,
    Ty Value,
    memory_order Order) noexcept;

template <class Ty>
inline Ty atomic_exchange_explicit(
    atomic<Ty>* Atom,
    Ty Value,
    memory_order Order) noexcept;

参数

Atom
指向存储类型 Ty 值的 atomic 对象的指针。

Value
一个 Ty 类型的值。

Order
一个 memory_order

返回值

交换前 Atom 的存储值。

备注

atomic_exchange_explicit 函数执行读取-修改-写入操作,在 Order 指定的内存约束范围内,将存储在 Atom 中的值与 Value 交换。

atomic_fetch_add

将值添加到 atomic 对象中存储的现有值。

template <class T>
T* atomic_fetch_add(volatile atomic<T*>* Atom, ptrdiff_t Value) noexcept;
template <class T>
T* atomic_fetch_add(atomic<T*>* Atom, ptrdiff_t Value) noexcept;

参数

Atom
一个指向 atomic 对象的指针,该对象存储指向类型 T 的指针。

Value
一个 ptrdiff_t 类型的值。

返回值

执行该操作之前的 atomic 对象包含的指针的值。

注解

atomic_fetch_add 函数执行读取-修改-写入操作,使用 memory_order.memory_order_seq_cst 约束以原子方式将 Value 添加到 Atom 中存储的值。

当原子类型为 atomic_address 时,Value 具有类型 ptrdiff_t,并且操作将存储指针视为 char *

另外还将为整型类型重载该操作:

integral atomic_fetch_add(volatile atomic-integral* Atom, integral Value) noexcept;

integral atomic_fetch_add(atomic-integral* Atom, integral Value) noexcept;

atomic_fetch_add_explicit

将值添加到 atomic 对象中存储的现有值。

template <class T>
T* atomic_fetch_add_explicit(
    volatile atomic<T*>* Atom,
    ptrdiff_t Value,
    memory_order Order) noexcept;

template <class T>
T* atomic_fetch_add_explicit(
    atomic<T*>* Atom,
    ptrdiff_t Value,
    memory_order Order) noexcept;

参数

Atom
一个指向 atomic 对象的指针,该对象存储指向类型 T 的指针。

Value
一个 ptrdiff_t 类型的值。

返回值

执行该操作之前的 atomic 对象包含的指针的值。

备注

atomic_fetch_add_explicit 函数执行读取-修改-写入操作,在 Order 指定的 memory_order 约束范围内,以原子方式将 Value 添加到 Atom 中存储的值。

当原子类型为 atomic_address 时,Value 具有类型 ptrdiff_t,并且操作将存储指针视为 char *

另外还将为整型类型重载该操作:

integral atomic_fetch_add_explicit(
    volatile atomic-integral* Atom,
    integral Value,
    memory_order Order) noexcept;

integral atomic_fetch_add_explicit(
    atomic-integral* Atom,
    integral Value,
    memory_order Order) noexcept;

atomic_fetch_and

对某个值和存储在 atomic 对象中的一个现有值执行按位 &

template <class T>
inline T atomic_fetch_and(volatile atomic<T>* Atom, T Value) noexcept;
template <class T>
inline T atomic_fetch_and(volatile atomic<T>* Atom, T Value) noexcept;

参数

Atom
指向存储类型 T 值的 atomic 对象的指针。

Value
一个 T 类型的值。

返回值

执行该操作之前的 atomic 对象包含的值。

备注

atomic_fetch_and 函数执行读取-修改-写入操作,使用 memory_order.memory_order_seq_cst 约束将 Atom 的存储值替换为 Value 的按位 & 和存储在 Atom 中的当前值。

atomic_fetch_and_explicit

对某个值和存储在 atomic 对象中的一个现有值执行按位 &

template <class T>
inline T atomic_fetch_and_explicit(
    volatile atomic<T>* Atom,
    T Value,
    memory_order Order) noexcept;

template <class T>
inline T atomic_fetch_and_explicit(
    volatile atomic<T>* Atom,
    T Value,
    memory_order Order) noexcept;

参数

Atom
指向存储类型 T 值的 atomic 对象的指针。

Value
一个 T 类型的值。

Order
一个 memory_order

返回值

执行该操作之前的 atomic 对象包含的值。

备注

atomic_fetch_and_explicit 函数执行读取-修改-写入操作,以在 Order 指定的内存约束范围内,将 Atom 的存储值替换为 Value 的按位 & 和存储在 Atom 中的当前值。

atomic_fetch_or

对某个值和存储在 atomic 对象中的一个现有值执行按位 or

template <class T>
inline T atomic_fetch_or (volatile atomic<T>* Atom, T Value) noexcept;
template <class T>
inline T atomic_fetch_or (volatile atomic<T>* Atom, T Value) noexcept;

参数

Atom
指向存储类型 T 值的 atomic 对象的指针。

Value
一个 T 类型的值。

返回值

执行该操作之前的 atomic 对象包含的值。

注解

atomic_fetch_or 函数执行读取-修改-写入操作,使用 memory_order.memory_order_seq_cstAtom 的存储值替换为 Value 的按位 or 和存储在 Atom 中的当前值。

atomic_fetch_or_explicit

对某个值和存储在 atomic 对象中的一个现有值执行按位 or

template <class T>
inline T atomic_fetch_or_explicit(
    volatile atomic<T>* Atom,
    T Value,
    memory_order Order) noexcept;

template <class T>
inline T atomic_fetch_or_explicit(
    volatile atomic<T>* Atom,
    T Value,
    memory_order Order) noexcept;

参数

Atom
指向存储类型 T 值的 atomic 对象的指针。

Value
一个 T 类型的值。

Order
一个 memory_order

返回值

执行该操作之前的 atomic 对象包含的值。

备注

atomic_fetch_or_explicit 函数执行读取-修改-写入操作,以在 Order 指定的 memory_order 约束范围内,将 Atom 的存储值替换为 Value 的按位 or 和存储在 Atom 中的当前值。

atomic_fetch_sub

atomic 对象存储的现有值中减去一个值。

template <class T>
T* atomic_fetch_sub(
    volatile atomic<T*>* Atom,
    ptrdiff_t Value) noexcept;

template <class T>
T* atomic_fetch_sub(
    atomic<T*>* Atom,
    ptrdiff_t Value) noexcept;

参数

Atom
一个指向 atomic 对象的指针,该对象存储指向类型 T 的指针。

Value
一个 ptrdiff_t 类型的值。

返回值

执行该操作之前的 atomic 对象包含的指针的值。

注解

atomic_fetch_sub 函数执行读取-修改-写入操作,使用 memory_order.memory_order_seq_cst 约束以原子方式从 Atom 存储的值中减去 Value

当原子类型为 atomic_address 时,Value 具有类型 ptrdiff_t,并且操作将存储指针视为 char *

另外还将为整型类型重载该操作:

integral atomic_fetch_sub(volatile atomic-integral* Atom, integral Value) noexcept;
integral atomic_fetch_sub(atomic-integral* Atom, integral Value) noexcept;

atomic_fetch_sub_explicit

atomic 对象存储的现有值中减去一个值。

template <class T>
T* atomic_fetch_sub_explicit(
    volatile atomic<T*>* Atom,
    ptrdiff_t Value,
    memory_order Order) noexcept;

template <class T>
T* atomic_fetch_sub_explicit(
    atomic<T*>* Atom,
    ptrdiff_t Value, memory_order Order) noexcept;

参数

Atom
一个指向 atomic 对象的指针,该对象存储指向类型 T 的指针。

Value
一个 ptrdiff_t 类型的值。

返回值

执行该操作之前的 atomic 对象包含的指针的值。

备注

atomic_fetch_sub_explicit 函数执行读取-修改-写入操作,以在 Order 指定的 memory_order 约束范围内,以原子方式从 Atom 中存储的值减去 Value

当原子类型为 atomic_address 时,Value 具有类型 ptrdiff_t,并且操作将存储指针视为 char *

另外还将为整型类型重载该操作:

integral atomic_fetch_sub_explicit(
    volatile atomic-integral* Atom,
    integral Value,
    memory_order Order) noexcept;

integral atomic_fetch_sub_explicit(
    atomic-integral* Atom,
    integral Value,
    memory_order Order) noexcept;

atomic_fetch_xor

对某个值和存储在 atomic 对象中的一个现有值执行按位 exclusive or

template <class T>
inline T atomic_fetch_xor(volatile atomic<T>* Atom, T Value) noexcept;

template <class T>
inline T atomic_fetch_xor(volatile atomic<T>* Atom, T Value) noexcept;

参数

Atom
指向存储类型 T 值的 atomic 对象的指针。

Value
一个 T 类型的值。

返回值

执行该操作之前的 atomic 对象包含的值。

注解

atomic_fetch_xor 函数执行读取-修改-写入操作,使用 memory_order.memory_order_seq_cstAtom 的存储值替换为 Value 的按位 exclusive or 和存储在 Atom 中的当前值。

atomic_fetch_xor_explicit

对某个值和存储在 atomic 对象中的一个现有值执行按位 exclusive or

template <class T>
inline T atomic_fetch_xor_explicit(
    volatile atomic<T>* Atom,
    T Value,
    memory_order Order) noexcept;

template <class T>
inline T atomic_fetch_xor_explicit(
    volatile atomic<T>* Atom,
    T Value,
    memory_order Order) noexcept;

参数

Atom
指向存储类型 T 值的 atomic 对象的指针。

Value
一个 T 类型的值。

Order
一个 memory_order

返回值

执行该操作之前的 atomic 对象包含的值。

注解

atomic_fetch_xor_explicit 函数执行读取-修改-写入操作,以在 Order 指定的 memory_order 约束范围内,将 Atom 的存储值替换为 Value 的按位 exclusive or 和存储在 Atom 中的当前值。

atomic_flag_clear

memory_order.memory_order_seq_cst 内,将 atomic_flag 对象中的 bool 标志设置为 false

inline void atomic_flag_clear(volatile atomic_flag* Flag) noexcept;
inline void atomic_flag_clear(atomic_flag* Flag) noexcept;

参数

Flag
指向 atomic_flag 对象的指针。

atomic_flag_clear_explicit

在指定的 memory_order 约束内,将 atomic_flag 对象中的 bool 标志设置为 false

inline void atomic_flag_clear_explicit(volatile atomic_flag* Flag, memory_order Order) noexcept;
inline void atomic_flag_clear_explicit(atomic_flag* Flag, memory_order Order) noexcept;

参数

Flag
指向 atomic_flag 对象的指针。

Order
一个 memory_order

atomic_flag_test_and_set

memory_order.memory_order_seq_cst 的约束范围内,将 atomic_flag 对象中的 bool 标志设置为 true

inline bool atomic_flag_test_and_set(volatile atomic_flag* Flag,) noexcept;
inline bool atomic_flag_test_and_set(atomic_flag* Flag,) noexcept;

参数

Flag
指向 atomic_flag 对象的指针。

返回值

Flag 的初始值。

atomic_flag_test_and_set_explicit

在指定的 memory_order 约束内,将 atomic_flag 对象中的 bool 标志设置为 true

inline bool atomic_flag_test_and_set_explicit(volatile atomic_flag* Flag, memory_order Order) noexcept;
inline bool atomic_flag_test_and_set_explicit(atomic_flag* Flag, memory_order Order) noexcept;

参数

Flag
指向 atomic_flag 对象的指针。

Order
一个 memory_order

返回值

Flag 的初始值。

atomic_init

设置 atomic 对象中存储的值。

template <class Ty>
inline void atomic_init(volatile atomic<Ty>* Atom, Ty Value) noexcept;
template <class Ty>
inline void atomic_init(atomic<Ty>* Atom, Ty Value) noexcept;

参数

Atom
指向存储类型 Ty 值的 atomic 对象的指针。

Value
一个 Ty 类型的值。

备注

atomic_init 不是一个原子操作。 它不是线程安全的。

atomic_is_lock_free

指定对 atomic 对象执行的原子操作是否为无锁

template <class T>
inline bool atomic_is_lock_free(const volatile atomic<T>* Atom) noexcept;
template <class T>
inline bool atomic_is_lock_free(const atomic<T>* Atom) noexcept;

参数

Atom
指向存储类型 T 值的 atomic 对象的指针。

返回值

如果对 Atom 执行的原子操作为无锁,则返回 true;否则,返回 false

注解

如果对该类型执行的原子操作都没有使用锁,则原子类型为无锁。 如果此函数返回 true,则可以安全地在信号处理程序中使用该类型。

atomic_load

检索 atomic 对象中存储的值。

template <class Ty>
inline Ty atomic_load(const volatile atomic<Ty>* Atom) noexcept;
template <class Ty>
inline Ty atomic_load(const atomic<Ty>* Atom) noexcept;

参数

Atom
指向包含 Ty 类型值的 atomic 对象的指针。

返回值

存储在 Atom 中的检索到的值。

注解

atomic_load 隐式使用 memory_order.memory_order_seq_cst

atomic_load_explicit

检索 atomic 对象中存储的值(限于指定的 memory_order)。

template <class Ty>
inline Ty atomic_load_explicit(const volatile atomic<Ty>* Atom, memory_order Order) noexcept;
template <class Ty>
inline Ty atomic_load_explicit(const atomic<Ty>* Atom, memory_order Order) noexcept;

参数

Atom
指向包含 Ty 类型值的 atomic 对象的指针。

Order
一个 memory_order。 不要使用 memory_order_releasememory_order_acq_rel

返回值

存储在 Atom 中的检索到的值。

atomic_signal_fence

充当调用线程中信号处理程序在同一线程中执行的其他 fence 之间的 fence(强制在加载/存储操作之间进行排序的内存同步基元)。

inline void atomic_signal_fence(memory_order Order) noexcept;

参数

Order
确定 fence 类型的内存排序约束。

注解

Order 参数确定 fence 类型。

说明
memory_order_relaxed fence 不起作用。
memory_order_consume fence 为 acquire fence。
memory_order_acquire fence 为 acquire fence。
memory_order_release fence 为 release fence。
memory_order_acq_rel fence 既是 acquire fence 也是 release fence。
memory_order_seq_cst fence 既是 acquire fence 也是 release fence,并且在顺序上保持一致。

atomic_store

以原子方式将值存储在 atomic 对象中。

template <class Ty>
inline Ty atomic_store_explicit(const volatile atomic<Ty>* Atom, Ty Value) noexcept;
template <class Ty>
inline Ty atomic_store_explicit(const atomic<Ty>* Atom, T Value) noexcept;

参数

Atom
指向包含 Ty 类型值的 atomic 对象的指针。

Value
一个 Ty 类型的值。

注解

atomic_storememory_order.memory_order_seq_cst 约束的范围内,将 Value 存储在 Atom 所指向的对象中。

atomic_store_explicit

以原子方式将值存储在 atomic 对象中。

template <class Ty>
inline Ty atomic_store_explicit(
    const volatile atomic<Ty>* Atom,
    Ty Value,
    memory_order Order) noexcept;

template <class Ty>
inline Ty atomic_store_explicit(
    const atomic<Ty>* Atom,
    T Value,
    memory_order Order) noexcept;

参数

Atom
指向包含 Ty 类型值的 atomic 对象的指针。

Value
一个 Ty 类型的值。

Order
一个 memory_order。 请勿使用 memory_order_consumememory_order_acquirememory_order_acq_rel

注解

atomic_storeValue 存储到 Atom 所指向的对象中(限于 Order 指定的 memory_order)。

atomic_thread_fence

充当 fence(强制在加载/存储操作之间进行排序的内存同步基元),没有关联的原子操作。

inline void atomic_thread_fence(memory_order Order) noexcept;

参数

Order
确定 fence 类型的内存排序约束。

注解

Order 参数确定 fence 类型。

说明
memory_order_relaxed fence 不起作用。
memory_order_consume fence 为 acquire fence。
memory_order_acquire fence 为 acquire fence。
memory_order_release fence 为 release fence。
memory_order_acq_rel fence 既是 acquire fence 也是 release fence。
memory_order_seq_cst fence 既是 acquire fence 也是 release fence,并且在顺序上保持一致。

kill_dependency

删除依赖关系。

template <class Ty>
Ty kill_dependency(Ty Arg) noexcept;

参数

Arg
一个 Ty 类型的值。

返回值

返回值为 ArgArg 的求值不会将依赖关系传送至函数调用。 通过中断可能的依赖关系链,该函数可能允许编译器生成更高效的代码。

另请参阅

<atomic>