[atomics.ref.pointer] (original) (raw)

31 Atomic operations library [atomics]

31.7 Class template atomic_­ref [atomics.ref.generic]

31.7.4 Partial specialization for pointers [atomics.ref.pointer]

namespace std { template struct atomic_ref<T*> { private: T** ptr;
public: using value_type = T*; 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;

explicit atomic_ref(T*&);
atomic_ref(const atomic_ref&) noexcept;
atomic_ref& operator=(const atomic_ref&) = delete;

void store(T*, memory_order = memory_order::seq_cst) const noexcept;
T* operator=(T*) const noexcept;
T* load(memory_order = memory_order::seq_cst) const noexcept;
operator T*() const noexcept;

T* exchange(T*, memory_order = memory_order::seq_cst) const noexcept;
bool compare_exchange_weak(T*&, T*,
                           memory_order, memory_order) const noexcept;
bool compare_exchange_strong(T*&, T*,
                             memory_order, memory_order) const noexcept;
bool compare_exchange_weak(T*&, T*,
                           memory_order = memory_order::seq_cst) const noexcept;
bool compare_exchange_strong(T*&, T*,
                             memory_order = memory_order::seq_cst) const noexcept;

T* fetch_add(difference_type, memory_order = memory_order::seq_cst) const noexcept;
T* fetch_sub(difference_type, memory_order = memory_order::seq_cst) const noexcept;

T* operator++(int) const noexcept;
T* operator--(int) const noexcept;
T* operator++() const noexcept;
T* operator--() const noexcept;
T* operator+=(difference_type) const noexcept;
T* operator-=(difference_type) const noexcept;

void wait(T*, memory_order = memory_order::seq_cst) const noexcept;
void notify_one() const noexcept;
void notify_all() const noexcept;

}; }

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

The following operations perform arithmetic computations.

The key, operator, and computation correspondence is identified in Table 145.

T* fetch_key(difference_type operand, memory_order order = memory_order::seq_cst) const noexcept;

Mandates: T is a complete object type.

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

Memory is affected according to the value of order.

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

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

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

T* operator op=(difference_type operand) const noexcept;

Effects:Equivalent to:return fetch_­key(operand) op operand;