D.3.10. Специализации std::atomic<integral-type>
Специализации std::atomic<integral-type> шаблона класса std::atomic дают атомарный целочисленный тип для каждого фундаментального целочисленного типа, с полным набором операций.
Ниже перечислены все такие специализации шаблона std::atomic<>:
std::atomic<char>
std::atomic<signed char>
std::atomic<unsigned char>
std::atomic<short>
std::atomic<unsigned short>
std::atomic<int>
std::atomic<unsigned>
std::atomic<long>
std::atomic<unsigned long>
std::atomic<long long>
std::atomic<unsigned long long>
std::atomic<wchar_t>
std::atomic<char16_t>
std::atomic<char32_t>
Экземпляры этих специализаций не удовлетворяют требованиям концепций CopyConstructible и CopyAssignable, поскольку такие операции невозможно выполнить атомарно.
Определение класса
template<>
struct atomic<integral-type> {
atomic() noexcept = default;
constexpr atomic(integral-type) noexcept;
bool operator=(integral-type) volatile noexcept;
atomic(const atomic&) = delete;
atomic& operator=(const atomic&) = delete;
atomic& operator=(const atomic&) volatile = delete;
bool is_lock_free() const volatile noexcept;
bool is_lock_free() const noexcept;
void store(
integral-type, memory_order = memory_order_seq_cst)
volatile noexcept;
void store(
integral-type, memory_order = memory_order_seq_cst) noexcept;
integral-type load(memory_order = memory_order_seq_cst)
const volatile noexcept;
integral-type load(
memory_order = memory_order_seq_cst) const noexcept;
integral-type exchange(
integral-type,
memory_order = memory_order_seq_cst) volatile noexcept;
integral-type exchange(
integral-type, memory_order = memory_order_seq_cst) noexcept;
bool compare_exchange_strong(
integral-type & old_value, integral-type new_value,
memory_order order = memory_order_seq_cst)
volatile noexcept;
bool compare_exchange_strong(
integral-type & old_value, integral-type new_value,
memory_order order = memory_order_seq_cst) noexcept;
bool compare_exchange_strong(
integral-type & old_value, integral-type new_value,
memory_order success_order, memory_order failure_order)
volatile noexcept;
bool compare_exchange_strong(
integral-type & old_value, integral-type new_value,
memory_order success_order,
memory_order failure_order) noexcept;
bool compare_exchange_weak(
integral-type & old_value, integral-type new_value,
memory_order order = memory_order_seq_cst) volatile noexcept;
bool compare_exchange_weak(
integral-type & old_value, integral-type new_value,
memory_order order = memory_order_seq_cst) noexcept;
bool compare_exchange_weak(
integral-type & old_value, integral-type new_value,
memory_order success_order, memory_order failure_order)
volatile noexcept;
bool compare_exchange_weak(
integral-type & old_value, integral-type new_value,
memory_order success_order,
memory_order failure_order) noexcept;
operator integral-type() const volatile noexcept;
operator integral-type() const noexcept;
integral-type fetch_add(
integral-type, memory_order = memory_order_seq_cst)
volatile noexcept;
integral-type fetch_add(
integral-type, memory_order = memory_order_seq_cst) noexcept;
integral-type fetch_sub(
integral-type, memory_order = memory_order_seq_cst)
volatile noexcept;
integral-type fetch_sub(
integral-type, memory_order = memory_order_seq_cst) noexcept;
integral-type fetch_and(
integral-type, memory_order = memory_order_seq_cst)
volatile noexcept;
integral-type fetch_and(
integral-type, memory_order = memory_order_seq_cst) noexcept;
integral-type fetch_or(
integral-type, memory_order = memory_order_seq_cst)
volatile noexcept;
integral-type fetch_or(
integral-type, memory_order = memory_order_seq_cst) noexcept;
integral-type fetch_xor(
integral-type, memory_order = memory_order_seq_cst)
volatile noexcept;
integral-type fetch_xor(
integral-type, memory_order = memory_order_seq_cst) noexcept;
integral-type operator++() volatile noexcept;
integral-type operator++() noexcept;
integral-type operator++(int) volatile noexcept;
integral-type operator++(int) noexcept;
integral-type operator--() volatile noexcept;
integral-type operator--() noexcept;
integral-type operator--(int) volatile noexcept;
integral-type operator--(int) noexcept;
integral-type operator+=(integral-type) volatile noexcept;
integral-type operator+=(integral-type) noexcept;
integral-type operator-=(integral-type) volatile noexcept;
integral-type operator-=(integral-type) noexcept;
integral-type operator&=(integral-type) volatile noexcept;
integral-type operator&=(integral-type) noexcept;
integral-type operator|=(integral-type) volatile noexcept;
integral-type operator|=(integral-type) noexcept;
integral-type operator^=(integral-type) volatile noexcept;
integral-type operator^=(integral-type) noexcept;
};
bool atomic_is_lock_free(
volatile const atomic<integral-type>*) noexcept;
bool atomic_is_lock_free(const atomic<integral-type>*) noexcept;
void atomic_init(
volatile atomic<integral-type>*, integral-type) noexcept;
void atomic_init(atomic<integral-type>*, integral-type) noexcept;
integral-type atomic_exchange(
volatile atomic<integral-type>*, integral-type) noexcept;
integral-type atomic_exchange(
atomic<integral-type>*, integral-type) noexcept;
integral-type atomic_exchange_explicit(
volatile atomic<integral-type>*, integral-type, memory_order)
noexcept;
integral-type atomic_exchange_explicit(
atomic<integral-type>*, integral-type, memory_order) noexcept;
void atomic_store(
volatile atomic<integral-type>*, integral-type) noexcept;
void atomic_store(
atomic<integral-type>*, integral-type) noexcept;
void atomic_store_explicit(
volatile atomic<integral-type>*,
integral-type, memory_order) noexcept;
void atomic_store_explicit(
atomic<integral-type>*, integral-type, memory_order) noexcept;
integral-type atomic_load(
volatile const atomic<integral-type>*) noexcept;
integral-type atomic_load(
const atomic<integral-type>*) noexcept;
integral-type atomic_load_explicit(
volatile const atomic<integral-type>*, memory_order) noexcept;
integral-type atomic_load_explicit(
const atomic<integral-type>*, memory_order) noexcept;
bool atomic_compare_exchange_strong(
volatile atomic<integral-type>*, integral-type * old_value,
integral-type new_value) noexcept;
bool atomic_compare_exchange_strong(
atomic<integral-type>*,
integral-type * old_value, integral-type new_value) noexcept;
bool atomic_compare_exchange_strong_explicit(
volatile atomic<integral-type>*,
integral-type * old_value, integral-type new_value,
memory_order success_order,
memory_order failure_order) noexcept;
bool atomic_compare_exchange_strong_explicit(
atomic<integral-type>*,
integral-type * old_value, integral-type new_value,
memory_order success_order,
memory_order failure_order) noexcept;
bool atomic_compare_exchange_weak(
volatile atomic<integral-type>*,
integral-type * old_value, integral-type new_value) noexcept;
bool atomic_compare_exchange_weak(
atomic<integral-type>*,
integral-type * old_value, integral-type new_value) noexcept;
bool atomic_compare_exchange_weak_explicit(
volatile atomic<integral-type>*,
integral-type * old_value, integral-type new_value,
memory_order success_order,
memory_order failure_order) noexcept;
bool atomic_compare_exchange_weak_explicit(
atomic<integral-type>*,
integral-type * old_value, integral-type new_value,
memory_order success_order,
memory_order failure_order) noexcept;
integral-type atomic_fetch_add(
volatile atomic<integral-type>*, integral-type) noexcept;
integral-type atomic_fetch_add(
atomic<integral-type>*, integral-type) noexcept;
integral-type atomic_fetch_add_explicit(
volatile atomic<integral-type>*, integral-type,
memory_order) noexcept;
integral-type atomic_fetch_add_explicit(
atomic<integral-type>*, integral-type, memory_order) noexcept;
integral-type atomic_fetch_sub(
volatile atomic<integral-type>*, integral-type) noexcept;
integral-type atomic_fetch_sub(
atomic<integral-type>*, integral-type) noexcept;
integral-type atomic_fetch_sub_explicit(
volatile atomic<integral-type>*,
integral-type, memory_order) noexcept;
integral-type atomic_fetch_sub_explicit(
atomic<integral-type>*, integral-type, memory_order) noexcept;
integral-type atomic_fetch_and(
volatile atomic<integral-type>*, integral-type) noexcept;
integral-type atomic_fetch_and(
atomic<integral-type>*, integral-type) noexcept;
integral-type atomic_fetch_and_explicit(
volatile atomic<integral-type>*,
integral-type, memory_order) noexcept;
integral-type atomic_fetch_and_explicit(
atomic<integral-type>*, integral-type, memory_order) noexcept;
integral-type atomic_fetch_or(
volatile atomic<integral-type>*, integral-type) noexcept;
integral-type atomic_fetch_or(
atomic<integral-type>*, integral-type) noexcept;
integral-type atomic_fetch_or_explicit(
volatile atomic<integral-type>*,
integral-type, memory_order) noexcept;
integral-type atomic_fetch_or_explicit(
atomic<integral-type>*, integral-type, memory_order) noexcept;
integral-type atomic_fetch_xor(
volatile atomic<integral-type>*, integral-type) noexcept;
integral-type atomic_fetch_xor(
atomic<integral-type>*, integral-type) noexcept;
integral-type atomic_fetch_xor_explicit(
volatile atomic<integral-type>*,
integral-type, memory_order) noexcept;
integral-type atomic_fetch_xor_explicit(
atomic<integral-type>*, integral-type, memory_order) noexcept;
Те операции, которые предоставляются также основным шаблоном (см. D.3.8), имеют точно такую же семантику.
STD::ATOMIC<INTEGRAL-TYPE>::FETCH_ADD , ФУНКЦИЯ-ЧЛЕН
Атомарно загружает значение и заменяет его суммой его самого и аргумента i.
Объявление
fetch_add(
integral-type i, memory_order order = memory_order_seq_cst)
volatile noexcept;
integral-type fetch_add(
integral-type i, memory_order order = memory_order_seq_cst)
noexcept;
Результат
Атомарно возвращает прежнее значение *this и сохраняет в *this значение old-value + i.
Возвращаемое значение
Значение *this непосредственно перед сохранением.
Исключения
Нет.
Примечание. Это атомарная операция чтения-модификации-записи для ячейки памяти, содержащей *this.
STD::ATOMIC_FETCH_ADD , ФУНКЦИЯ, HE ЯВЛЯЮЩАЯСЯ ЧЛЕНОМ КЛАССА
Атомарно читает значение из экземпляра atomic<integral-type> и заменяет его суммой этого значения и аргумента i.
Объявление
integral-type atomic_fetch_add(
volatile atomic<integral-type>* p, integral-type i) noexcept;
integral-type atomic_fetch_add(
atomic<integral-type>* p, integral-type i) noexcept;
Результат
return p->fetch_add(i);
STD::ATOMIC_FETCH_ADD_EXPLICIT , ФУНКЦИЯ, HE ЯВЛЯЮЩАЯСЯ ЧЛЕНОМ
КЛАССА
Атомарно читает значение из экземпляра atomic<integral-type> и заменяет его суммой этого значения и аргумента i.
Объявление
integral-type atomic_fetch_add_explicit(
volatile atomic<integral-type>* p, integral-type i,
memory_order order) noexcept;
integral-type atomic_fetch_add_explicit(
atomic<integral-type>* p, integral-type i,
memory_order order) noexcept;
Результат
return p->fetch_add(i,order);
STD::ATOMIC<INTEGRAL-TYPE>::FETCH_SUB , ФУНКЦИЯ-ЧЛЕН
Атомарно читает значение и заменяет его разностью этого значения и аргумента i.
Объявление
integral-type fetch_sub(
integral-type i,
memory_order order = memory_order_seq_cst) volatile noexcept;
integral-type fetch_sub(
integral-type i,
memory_order order = memory_order_seq_cst) noexcept;
Результат
Атомарно возвращает прежнее значение *this и сохраняет в *this значение old-value - i.
Возвращаемое значение
Значение *this непосредственно перед сохранением.
Исключения
Нет.
Примечание. Это атомарная операция чтения-модификации-записи для ячейки памяти, содержащей *this.
STD::ATOMIC_FETCH_SUB , ФУНКЦИЯ, НЕ ЯВЛЯЮЩАЯСЯ ЧЛЕНОМ КЛАССА
Атомарно читает значение из экземпляра atomic<integral-type> и заменяет его разностью этого значения и аргумента i.
Объявление
integral-type atomic_fetch_sub(
volatile atomic<integral-type>* p, integral-type i) noexcept;
integral-type atomic_fetch_sub(
atomic<integral-type>* p, integral-type i) noexcept;
Результат
return p->fetch_sub(i);
STD::ATOMIC_FETCH_SUB_EXPLICIT , ФУНКЦИЯ, HE ЯВЛЯЮЩАЯСЯ ЧЛЕНОМ КЛАССА
Атомарно читает значение из экземпляра atomic<integral-type> и заменяет его разностью этого значения и аргумента i.
Объявление
integral-type atomic_fetch_sub_explicit(
volatile atomic<integral-type>* p,
integral-type i, memory_order order) noexcept;
integral-type atomic_fetch_sub_explicit(
atomic<integral-type>* p,
integral-type i, memory_order order) noexcept;
Результат
return p->fetch_sub(i, order);
STD::ATOMIC<INTEGRAL-TYPE>::FETCH_AND , ФУНКЦИЯ-ЧЛЕН
Атомарно загружает значение и заменяет его результатом операции поразрядное-и между этим значением и аргументом i.
Объявление
integral-type fetch_and(
integral-type i, memory_order order = memory_order_seq_cst)
volatile noexcept;
integral-type fetch_and(
integral-type i, memory_order order = memory_order_seq_cst)
noexcept;
Результат
Атомарно возвращает прежнее значение *this и сохраняет в *this значение old-value & i.
Возвращаемое значение
Значение *this непосредственно перед сохранением.
Исключения
Нет.
Примечание. Это атомарная операция чтения-модификации-записи для ячейки памяти, содержащей *this.
STD::ATOMIC_FETCH_AND , ФУНКЦИЯ, НЕ ЯВЛЯЮЩАЯСЯ ЧЛЕНОМ КЛАССА
Атомарно читает значение из экземпляра atomic<integral-type> и заменяет его результатом операции поразрядное-и между этим значением и аргументом i. Объявление
integral-type atomic_fetch_and(
volatile atomic<integral-type>* p, integral-type i) noexcept;
integral-type atomic_fetch_and(
atomic<integral-type>* p, integral-type i) noexcept;
Результат
return p->fetch_and(i);
STD::ATOMIC_FETCH_AND_EXPLICIT , ФУНКЦИЯ, HE ЯВЛЯЮЩАЯСЯ ЧЛЕНОМ КЛАССА
Атомарно читает значение из экземпляра atomic<integral-type> и заменяет его результатом операции поразрядное-и между этим значением и аргументом i.
Объявление
integral-type atomic_fetch_and_explicit(
volatile atomic<integral-type>* p,
integral-type i, memory_order order) noexcept;
integral-type atomic_fetch_and_explicit(
atomic<integral-type>* p,
integral-type i, memory_order order) noexcept;
Результат
return p->fetch_and(i,order);
STD::ATOMIC<INTEGRAL-TYPE>::FETCH_OR , ФУНКЦИЯ-ЧЛЕН
Атомарно загружает значение и заменяет его результатом операции поразрядное-или между этим значением и аргументом i.
Объявление
integral-type fetch_or(
integral-type i, memory_order order = memory_order_seq_cst)
volatile noexcept;
integral-type fetch_or(
integral-type i, memory_order order = memory_order_seq_cst)
noexcept;
Результат
Атомарно возвращает прежнее значение *this и сохраняет в *this значение old-value | i.
Возвращаемое значение
Значение *this непосредственно перед сохранением.
Исключения
Нет.
Примечание. Это атомарная операция чтения-модификации-записи для ячейки памяти, содержащей *this.
STD::ATOMIC_FETCH_OR , ФУНКЦИЯ, HE ЯВЛЯЮЩАЯСЯ ЧЛЕНОМ КЛАССА
Атомарно читает значение из экземпляра atomic<integral-type> и заменяет его результатом операции поразрядное-или между этим значением и аргументом i.
Объявление
integral-type atomic_fetch_or(
volatile atomic<integral-type>* p, integral-type i) noexcept;
integral-type atomic_fetch_or(
atomic<integral-type>* p, integral-type i) noexcept;
Результат
return p->fetch_or(i);
STD::ATOMIC_FETCH_OR_EXPLICIT , ФУНКЦИЯ, HE ЯВЛЯЮЩАЯСЯ ЧЛЕНОМ КЛАССА
Атомарно читает значение из экземпляра atomic<integral-type> и заменяет его результатом операции поразрядное-или между этим значением и аргументом i.
Объявление
integral-type atomic_fetch_or_explicit(
volatile atomic<integral-type>* p,
integral-type i, memory_order order) noexcept;
integral-type atomic_fetch_or_explicit(
atomic<integral-type>* p,
integral-type i, memory_order order) noexcept;
Результат
return p->fetch_or(i, order);
STD::ATOMIC<INTEGRAL-TYPE>::FETCH_XOR , ФУНКЦИЯ-ЧЛЕН
Атомарно загружает значение и заменяет его результатом операции поразрядное исключающее-или между этим значением и аргументом i.
Объявление
integral-type fetch_xor(
integral-type i, memory_order order = memory_order_seq_cst)
volatile noexcept;
integral-type fetch_xor(
integral-type i, memory_order order = memory_order_seq_cst)
noexcept;
Результат
Атомарно возвращает прежнее значение *this и сохраняет в *this значение old-value ^ i.
Возвращаемое значение
Значение *this непосредственно перед сохранением.
Исключения
Нет.
Примечание. Это атомарная операция чтения-модификации-записи для ячейки памяти, содержащей *this.
STD::ATOMIC_FETCH_XOR , ФУНКЦИЯ, НЕ ЯВЛЯЮЩАЯСЯ ЧЛЕНОМ КЛАССА
Атомарно читает значение из экземпляра atomic<integral-type> и заменяет его результатом операции поразрядное исключающее-или между этим значением и аргументом i.
Объявление
integral-type atomic_fetch_xor(
volatile atomic<integral-type>* p, integral-type i) noexcept;
integral-type atomic_fetch_xor(
atomic<integral-type>* p, integral-type i) noexcept;
Результат
return p->fetch_xor(i);
STD::ATOMIC_FETCH_XOR_EXPLICIT , ФУНКЦИЯ, HE ЯВЛЯЮЩАЯСЯ ЧЛЕНОМ КЛАССА
Атомарно читает значение из экземпляра atomic<integral-type> и заменяет его результатом операции поразрядное исключающее-или между этим значением и аргументом i.
Объявление
integral-type atomic_fetch_xor_explicit(
volatile atomic<integral-type>* p,
integral-type i, memory_order order) noexcept;
integral-type atomic_fetch_xor_explicit(
atomic<integral-type>* p,
integral-type i, memory_order order) noexcept;
Результат
return p->fetch_xor(i,order);
STD::ATOMIC<INTEGRAL-TYPE>::OPERATOR++ , ОПЕРАТОР ПРЕДИНКРЕМЕНТА
Атомарно инкрементирует значение, хранящееся в *this, и возвращает новое значение.
Объявление
integral-type operator++() volatile noexcept;
integral-type operator++() noexcept;
Результат
return this->fetch_add(1) + 1;
STD::ATOMIC<INTEGRAL-TYPE>::OPERATOR++ , ОПЕРАТОР ПОСТИНКРЕМЕНТА
Атомарно инкрементирует значение, хранящееся в *this, и возвращает старое значение.
Объявление
integral-type operator++(int) volatile noexcept;
integral-type operator++(int) noexcept;
Результат
return this->fetch_add(1);
STD::ATOMIC<INTEGRAL-TYPE>::OPERATOR-- , ОПЕРАТОР ПРЕДЕКРЕМЕНТА
Атомарно декрементирует значение, хранящееся в *this, и возвращает новое значение.
Объявление
integral-type operator--() volatile noexcept;
integral-type operator--() noexcept;
Результат
return this->fetch_sub(1) - 1;
STD::ATOMIC<INTEGRAL-TYPE>::OPERATOR-- , ОПЕРАТОР ПОСТДЕКРЕМЕНТА
Атомарно декрементирует значение, хранящееся в *this, и возвращает старое значение.
Объявление
integral-type operator--(int) volatile noexcept;
integral-type operator--(int) noexcept;
Результат
return this->fetch_sub(1);
STD::ATOMIC<INTEGRAL-TYPE>::OPERATOR+= , СОСТАВНОЙ ОПЕРАТОР ПРИСВАИВАНИЯ
Атомарно складывает значение аргумента со значением, хранящимся в *this, и возвращает новое значение.
Объявление
integral-type operator+=(integral-type i) volatile noexcept;
integral-type operator+=(integral-type i) noexcept;
Результат
return this->fetch_add(i) + i;
STD::ATOMIC<INTEGRAL-TYPE>::OPERATOR-= , СОСТАВНОЙ ОПЕРАТОР ПРИСВАИВАНИЯ
Атомарно вычитает значение аргумента из значения, хранящегося в *this, и возвращает новое значение.
Объявление
integral-type operator-=(integral-type i) volatile noexcept;
integral-type operator-=(integral-type i) noexcept;
Результат
return this->fetch_sub(i, std::memory_order_seq_cst) - i;
STD::ATOMIC<INTEGRAL-TYPE>::OPERATOR&= , СОСТАВНОЙ ОПЕРАТОР ПРИСВАИВАНИЯ
Атомарно заменяет значение, хранящееся в *this, результатом операции поразрядное-и между этим значением и значением аргумента и возвращает новое значение.
Объявление
integral-type operator&=(integral-type i) volatile noexcept;
integral-type operator&=(integral-type i) noexcept;
Результат
return this->fetch_and(i) & i;
STD::ATOMIC<INTEGRAL-TYPE>::OPERATOR|= , СОСТАВНОЙ ОПЕРАТОР ПРИСВАИВАНИЯ
Атомарно заменяет значение, хранящееся в *this, результатом операции поразрядное-или между этим значением и значением аргумента и возвращает новое значение.
Объявление
integral-type operator|=(integral-type i) volatile noexcept;
integral-type operator|=(integral-type i) noexcept;
Результат
return this->fetch_or(i, std::memory_order_seq_cst) | i;
STD::ATOMIC<INTEGRAL-TYPE>::OPERATOR^= , СОСТАВНОЙ ОПЕРАТОР ПРИСВАИВАНИЯ
Атомарно заменяет значение, хранящееся в *this, результатом операции поразрядное исключающее-или между этим значением и значением аргумента и возвращает новое значение.
Объявление
integral-type operator^=(integral-type i) volatile noexcept;
integral-type operator^=(integral-type i) noexcept;
Результат
return this->fetch_xor(i, std::memory_order_seq_cst) ^ i;
STD::ATOMIC<T*> , ЧАСТИЧНАЯ СПЕЦИАЛИЗАЦИЯ
Частичная специализация std::atomic<T*> шаблона std::atomic предоставляет атомарный тип для любого указательного типа, с полным набором операций.
Экземпляры std::atomic<T*> не удовлетворяют требованиям концепций CopyConstructible и CopyAssignable, поскольку такие операции невозможно выполнить атомарно.
Определение класса
template<typename T>
struct atomic<T*> {
atomic() noexcept = default;
constexpr atomic(T*) noexcept;
bool operator=(T*) volatile;
bool operator=(T*);
atomic(const atomic&) = delete;
atomic& operator=(const atomic&) = delete;
atomic& operator=(const atomic&) volatile = delete;
bool is_lock_free() const volatile noexcept;
bool is_lock_free() const noexcept;
void store(T*, memory_order = memory_order_seq_cst)
volatile noexcept;
void store(T*, memory_order = memory_order_seq_cst) noexcept;
T* load(memory_order = memory_order_seq_cst)
const volatile noexcept;
T* load(memory_order = memory_order_seq_cst) const noexcept;
T* exchange(T*, memory_order = memory_order_seq_cst)
volatile noexcept;
T* exchange(T*, memory_order = memory_order_seq_cst) noexcept;
bool compare_exchange_strong(
T* & old_value, T* new_value,
memory_order order = memory_order_seq_cst)
volatile noexcept;
bool compare_exchange_strong(
T* & old_value, T* new_value,
memory_order order = memory_order_seq_cst) noexcept;
bool compare_exchange_strong(
T* & old_value, T* new_value,
memory_order success_order, memory_order failure_order)
volatile noexcept;
bool compare_exchange_strong(
T* & old_value, T* new_value,
memory_order success_order,
memory_order failure_order) noexcept;
bool compare_exchange_weak(
T* & old_value, T* new_value,
memory_order order = memory_order_seq_cst) volatile noexcept;
bool compare_exchange_weak(
T* & old_value, T* new_value,
memory_order order = memory_order_seq_cst) noexcept;
bool compare_exchange_weak(
T* & old_value, T* new_value,
memory_order success_order, memory_order failure_order)
volatile noexcept;
bool compare_exchange_weak(
T* & old_value, T* new_value,
memory_order success_order,
memory_order failure_order) noexcept;
operator T*() const volatile noexcept;
operator T*() const noexcept;
T* fetch_add(
ptrdiff_t, memory_order = memory_order_seq_cst)
volatile noexcept;
T* fetch_add(
ptrdiff_t, memory_order = memory_order_seq_cst) noexcept;
T* fetch_sub(
ptrdiff_t, memory_order = memory_order_seq_cst)
volatile noexcept;
T* fetch_sub(
ptrdiff_t, memory_order = memory_order_seq_cst) noexcept;
T* operator++() volatile noexcept;
T* operator++() noexcept;
T* operator++(int) volatile noexcept;
T* operator++(int) noexcept;
T* operator--() volatile noexcept;
T* operator--() noexcept;
T* operator--(int) volatile noexcept;
T* operator--(int) noexcept;
T* operator+=(ptrdiff_t) volatile noexcept;
T* operator+=(ptrdiff_t) noexcept;
T* operator-=(ptrdiff_t) volatile noexcept;
T* operator-=(ptrdiff_t) noexcept;
};
bool atomic_is_lock_free(volatile const atomic<T*>*) noexcept;
bool atomic_is_lock_free(const atomic<T*>*) noexcept;
void atomic_init(volatile atomic<T*>*, T*) noexcept;
void atomic_init(atomic<T*>*, T*) noexcept;
T* atomic_exchange(volatile atomic<T*>*, T*) noexcept;
T* atomic_exchange(atomic<T*>*, T*) noexcept;
T* atomic_exchange_explicit(
volatile atomic<T*>*, T*, memory_order) noexcept;
T* atomic_exchange_explicit(
atomic<T*>*, T*, memory_order) noexcept;
void atomic_store(volatile atomic<T*>*, T*) noexcept;
void atomic_store(atomic<T*>*, T*) noexcept;
void atomic_store_explicit(
volatile atomic<T*>*, T*, memory_order) noexcept;
void atomic_store_explicit(
atomic<T*>*, T*, memory_order) noexcept;
T* atomic_load(volatile const atomic<T*>*) noexcept;
T* atomic_load(const atomic<T*>*) noexcept;
T* atomic_load_explicit(
volatile const atomic<T*>*, memory_order) noexcept;
T* atomic_load_explicit(
const atomic<T*>*, memory_order) noexcept;
bool atomic_compare_exchange_strong(
volatile atomic<T*>*, T** old_value, T* new_value) noexcept;
bool atomic_compare_exchange_strong(
volatile atomic<T*>*, T** old_value, T* new_value) noexcept;
bool atomic_compare_exchange_strong_explicit(
atomic<T*>*, T** old_value, T* new_value,
memory_order success_order,
memory_order failure_order) noexcept;
bool atomic_compare_exchange_strong_explicit(
atomic<T*>*, T** old_value, T* new_value,
memory_order success_order,
memory_order failure_order) noexcept;
bool atomic_compare_exchange_weak(
volatile atomic<T*>*, T** old_value, T* new_value) noexcept;
bool atomic_compare_exchange_weak(
atomic<T*>*, T** old_value, T* new_value) noexcept;
bool atomic_compare_exchange_weak_explicit(
volatile atomic<T*>*,
T** old_value, T* new_value,
memory_order success_order,
memory_order failure_order) noexcept;
bool atomic_compare_exchange_weak_explicit(
atomic<T*>*, T** old_value, T* new_value,
memory_order success_order,
memory_order failure_order) noexcept;
T* atomic_fetch_add(volatile atomic<T*>*, ptrdiff_t) noexcept;
T* atomic_fetch_add(atomic<T*>*, ptrdiff_t) noexcept;
T* atomic_fetch_add_explicit(
volatile atomic<T*>*, ptrdiff_t, memory_order) noexcept;
T* atomic_fetch_add_explicit(
atomic<T*>*, ptrdiff_t, memory_order) noexcept;
T* atomic_fetch_sub(volatile atomic<T*>*, ptrdiff_t) noexcept;
T* atomic_fetch_sub(atomic<T*>*, ptrdiff_t) noexcept;
T* atomic_fetch_sub_explicit(
volatile atomic<T*>*, ptrdiff_t, memory_order) noexcept;
T* atomic_fetch_sub_explicit(
atomic<T*>*, ptrdiff_t, memory_order) noexcept;
Те операции, которые предоставляются также основным шаблоном (см. приложение D.3.8), имеют точно такую же семантику.
STD::ATOMIC<T*>::FETCH_ADD , ФУНКЦИЯ-ЧЛЕН
Атомарно загружает значение, заменяет его суммой этого значения и аргумента i, применяя стандартные правила арифметики указателей, и возвращает старое значение.
Объявление
T* fetch_add(
ptrdiff_t i, memory_order order = memory_order_seq_cst)
volatile noexcept;
T* fetch_add(
ptrdiff_t i, memory_order order = memory_order_seq_cst) noexcept;
Результат
Атомарно возвращает текущее значение *this и сохраняет в *this значение old-value + i.
Возвращаемое значение
Значение *this непосредственно перед сохранением.
Исключения
Нет.
Примечание. Это атомарная операция чтения-модификации-записи для ячейки памяти, содержащей *this.
STD::ATOMIC_FETCH_ADD_EXPLICIT , ФУНКЦИЯ, НЕ ЯВЛЯЮЩАЯСЯ ЧЛЕНОМ КЛАССА
Атомарно читает значение из экземпляра atomic<T*> и заменяет его суммой этого значения и аргумента i, применяя стандартные правила арифметики указателей.
Объявление
T* atomic_fetch_add_explicit(
volatile atomic<T*>* p, ptrdiff_t i, memory_order order)
noexcept;
T* atomic_fetch_add_explicit(
atomic<T*>* p, ptrdiff_t i, memory_order order) noexcept;
Результат
return p->fetch_add(i, order);
STD::ATOMIC<T*>::FETCH_SUB , ФУНКЦИЯ-ЧЛЕН
Атомарно загружает значение, заменяет его разностью этого значения и аргумента i, применяя стандартные правила арифметики указателей, и возвращает старое значение.
Объявление
T* fetch_sub(
ptrdiff_t i, memory_order order = memory_order_seq_cst)
volatile noexcept;
T* fetch_sub(
ptrdiff_t i, memory_order order = memory_order_seq_cst)
noexcept;
Результат
Атомарно возвращает текущее значение *this и сохраняет в *this значение old-value - i.
Возвращаемое значение
Значение *this непосредственно перед сохранением.
Исключения
Нет.
Примечание. Это атомарная операция чтения-модификации-записи для ячейки памяти, содержащей *this.
STD::ATOMIC_FETCH_SUB , ФУНКЦИЯ, НЕ ЯВЛЯЮЩАЯСЯ ЧЛЕНОМ КЛАССА
Атомарно читает значение из экземпляра atomic<T*> и заменяет его разностью этого значения и аргумента i, применяя стандартные правила арифметики указателей.
Объявление
T* atomic_fetch_sub(
volatile atomic<T*>* p, ptrdiff_t i) noexcept;
T* atomic_fetch_sub(atomic<T*>* p, ptrdiff_t i) noexcept;
Результат
return p->fetch_sub(i);
STD::ATOMIC_FETCH_SUB_EXPLICIT , ФУНКЦИЯ, HE ЯВЛЯЮЩАЯСЯ ЧЛЕНОМ КЛАССА
Атомарно читает значение из экземпляра atomic<T*> и заменяет его разностью этого значения и аргумента i, применяя стандартные правила арифметики указателей.
Объявление
T* atomic_fetch_sub_explicit(
volatile atomic<T*>* p, ptrdiff_t i, memory_order order)
noexcept;
T* atomic_fetch_sub_explicit(
atomic<T*>* p, ptrdiff_t i, memory_order order) noexcept;
Результат
return p->fetch_sub(i, order);
STD::ATOMIC<T*>::OPERATOR++ , ОПЕРАТОР ПРЕДИНКРЕМЕНТА
Атомарно инкрементирует значение, хранящееся в *this, применяя стандартные правила арифметики указателей, и возвращает новое значение.
Объявление
T* operator++() volatile noexcept;
T* operator++() noexcept;
Результат
return this->fetch_add(1) + 1;
STD::ATOMIC<T*>::OPERATOR++ , ОПЕРАТОР ПОСТИНКРЕМЕНТА
Атомарно инкрементирует значение, хранящееся в *this, и возвращает старое значение.
Объявление
T* operator++(int) volatile noexcept;
T* operator++(int) noexcept;
Результат
return this->fetch_add(1);
STD::ATOMIC<T*>::OPERATOR-- , ОПЕРАТОР ПРЕДЕКРЕМЕНТА
Атомарно декрементирует значение, хранящееся в *this, применяя стандартные правила арифметики указателей, и возвращает новое значение.
Объявление
T* operator--() volatile noexcept;
T* operator--() noexcept;
Результат
return this->fetch_sub(1) - 1;
STD::ATOMIC<T*>::OPERATOR-- , ОПЕРАТОР ПОСТДЕКРЕМЕНТА
Атомарно декрементирует значение, хранящееся в *this, применяя стандартные правила арифметики указателей, и возвращает старое значение.
Объявление
T* operator--(int) volatile noexcept;
T* operator--(int) noexcept;
Результат
return this->fetch_sub(1);
STD::ATOMIC<T*>::OPERATOR+= , СОСТАВНОЙ ОПЕРАТОР ПРИСВАИВАНИЯ
Атомарно складывает значение аргумента со значением, хранящимся в *this, применяя стандартные правила арифметики указателей, и возвращает новое значение.
Объявление
T* operator+=(ptrdiff_t i) volatile noexcept;
T* operator+=(ptrdiff_t i) noexcept;
Результат
return this->fetch_add(i) + i;
STD::ATOMIC<T*>::OPERATOR-= , СОСТАВНОЙ ОПЕРАТОР ПРИСВАИВАНИЯ
Атомарно вычитает значение аргумента из значения, хранящегося в *this, применяя стандартные правила арифметики указателей, и возвращает новое значение.
Объявление
T* operator-=(ptrdiff_t i) volatile noexcept;
T* operator-=(ptrdiff_t i) noexcept;
Результат
return this->fetch_sub(i) - i;