Files
2025-10-25 03:02:53 +03:00

8.8 KiB
Raw Permalink Blame History

[atomics.ref.pointer]

32 Concurrency support library [thread]

32.5 Atomic operations [atomics]

32.5.7 Class template atomic_ref [atomics.ref.generic]

32.5.7.5 Specialization for pointers [atomics.ref.pointer]

1

#

There are specializations of the atomic_ref class template for all pointer-to-object types.

For each such type pointer-type, the specialization atomic_ref<pointer-type> provides additional atomic operations appropriate to pointer types.

2

#

The program is ill-formed if is_always_lock_free is false andis_volatile_v<pointer-type> is true.

namespace std {template<> struct atomic_ref<pointer-type> {private:pointer-type* ptr; // exposition onlypublic:using value_type = remove_cv_t<pointer-type>; using difference_type = ptrdiff_t; static constexpr size_t required_alignment = implementation-defined; static constexpr bool is_always_lock_free = implementation-defined; bool is_lock_free() const noexcept; constexpr explicit atomic_ref(pointer-type&); constexpr atomic_ref(const atomic_ref&) noexcept; atomic_ref& operator=(const atomic_ref&) = delete; constexpr void store(value_type, memory_order = memory_order::seq_cst) const noexcept; constexpr value_type operator=(value_type) const noexcept; constexpr value_type load(memory_order = memory_order::seq_cst) const noexcept; constexpr operator value_type() const noexcept; constexpr value_type exchange(value_type, memory_order = memory_order::seq_cst) const noexcept; constexpr bool compare_exchange_weak(value_type&, value_type, memory_order, memory_order) const noexcept; constexpr bool compare_exchange_strong(value_type&, value_type, memory_order, memory_order) const noexcept; constexpr bool compare_exchange_weak(value_type&, value_type, memory_order = memory_order::seq_cst) const noexcept; constexpr bool compare_exchange_strong(value_type&, value_type, memory_order = memory_order::seq_cst) const noexcept; constexpr value_type fetch_add(difference_type, memory_order = memory_order::seq_cst) const noexcept; constexpr value_type fetch_sub(difference_type, memory_order = memory_order::seq_cst) const noexcept; constexpr value_type fetch_max(value_type, memory_order = memory_order::seq_cst) const noexcept; constexpr value_type fetch_min(value_type, memory_order = memory_order::seq_cst) const noexcept; constexpr void store_add(difference_type, memory_order = memory_order::seq_cst) const noexcept; constexpr void store_sub(difference_type, memory_order = memory_order::seq_cst) const noexcept; constexpr void store_max(value_type, memory_order = memory_order::seq_cst) const noexcept; constexpr void store_min(value_type, memory_order = memory_order::seq_cst) const noexcept; constexpr value_type operator++(int) const noexcept; constexpr value_type operator--(int) const noexcept; constexpr value_type operator++() const noexcept; constexpr value_type operator--() const noexcept; constexpr value_type operator+=(difference_type) const noexcept; constexpr value_type operator-=(difference_type) const noexcept; constexpr void wait(value_type, memory_order = memory_order::seq_cst) const noexcept; constexpr void notify_one() const noexcept; constexpr void notify_all() const noexcept; constexpr pointer-type* address() const noexcept; };}

3

#

Descriptions are provided below only for members that differ from the primary template.

4

#

The following operations perform arithmetic computations.

The correspondence among key, operator, and computation is specified in Table 156.

🔗

constexpr value_type fetch_key(difference_type operand, memory_order order = memory_order::seq_cst) const noexcept;

5

#

Constraints: is_const_v<pointer-type> is false.

6

#

Mandates: remove_pointer_t<pointer-type> is a complete object type.

7

#

Effects: Atomically replaces the value referenced by *ptr with the result of the computation applied to the value referenced by *ptr and the given operand.

Memory is affected according to the value of order.

These operations are atomic read-modify-write operations ([intro.races]).

8

#

Returns: Atomically, the value referenced by *ptr immediately before the effects.

9

#

Remarks: The result may be an undefined address, but the operations otherwise have no undefined behavior.

10

#

For fetch_max and fetch_min, the maximum and minimum computation is performed as if by max and min algorithms ([alg.min.max]), respectively, with the object value and the first parameter as the arguments.

[Note 1:

If the pointers point to different complete objects (or subobjects thereof), the < operator does not establish a strict weak ordering (Table 29, [expr.rel]).

— end note]

🔗

constexpr void store_key(see above operand, memory_order order = memory_order::seq_cst) const noexcept;

11

#

Mandates: T is a complete object type.

12

#

Preconditions: order is memory_order::relaxed,memory_order::release, ormemory_order::seq_cst.

13

#

Effects: Atomically replaces the value referenced by *ptr with the result of the computation applied to the value referenced by *ptr and the given operand.

Memory is affected according to the value of order.

These operations are atomic modify-write operations ([atomics.order]).

14

#

Remarks: The result may be an undefined address, but the operations otherwise have no undefined behavior.

For store_max and store_min, the maximum and minimum computation is performed as if by max and min algorithms ([alg.min.max]), respectively, with *ptr and the first parameter as the arguments.

[Note 2:

If the pointers point to different complete objects (or subobjects thereof), the < operator does not establish a strict weak ordering (Table 29, [expr.rel]).

— end note]

🔗

constexpr value_type operator op=(difference_type operand) const noexcept;

15

#

Constraints: is_const_v<pointer-type> is false.

16

#

Effects: Equivalent to:return fetch_key(operand) op operand;