namespace std {
template <class T>
void
atomic_store_sub(
volatile atomic<T>* object,
typename atomic<T>::difference_type operand) noexcept; // (1) C++26
template <class T>
constexpr void
atomic_store_sub(
atomic<T>* object,
typename atomic<T>::difference_type operand) noexcept; // (2) C++26
}
概要
値を読み込まずにアトミックに値を減算する。
この関数は、atomic_fetch_sub()と異なり、現在の (古い) 値を読み込むことなく現在の値に演算を行うため、高速に動作する。ただし変更前の古い値は戻り値として取得できない。
テンプレートパラメータ制約
- 型
Tがオブジェクト型であること。型Tがvoid*や関数ポインタであってはならない - (1) :
atomic<T>::is_always_lock_freeがtrueであること
事前条件
orderは、以下のいずれかであること
効果
memory_order_seq_cstのメモリオーダーにしたがって、現在の値にoperandを減算した値でアトミックに置き換える
戻り値
なし
例外
投げない
備考
符号付き整数型に対しては、2の補数表現による演算が行われ、未定義動作はない。アドレス型に関しては結果として未定義アドレスになる場合があるが、それ以外の未定義動作はない。
例
#include <iostream>
#include <atomic>
int main()
{
std::atomic<int> x(3);
std::atomic_store_sub(&x, 2);
std::cout << x.load() << std::endl;
}
出力
1
バージョン
言語
- C++26
処理系
- Clang: 21 ❌
- GCC: 15 ❌
- Visual C++: 2022 Update 13 ❌