namespace std {
template <class T>
void atomic_init(volatile atomic<T>* object,
T desired) noexcept; // (1) C++11
template <class T>
void atomic_init(volatile atomic<T>* object,
typename atomic<T>::value_type desired) noexcept; // (1) C++17
template <class T>
void atomic_init(atomic<T>* object,
T desired) noexcept; // (2) C++11
template <class T>
void atomic_init(atomic<T>* object,
typename atomic<T>::value_type desired) noexcept; // (2) C++17
}
この関数はC++20で非推奨となった。std::atomic
クラスのデフォルトコンストラクタが値初期化するようになったため、初期化のためにこの関数を使用する必要はない。
概要
アトミックオブジェクトを初期化する
テンプレートパラメータ制約
- (1) :
- C++20 :
atomic<T>::is_always_lock_free
がtrue
であること
- C++20 :
効果
この関数は、アトミックオブジェクトobject
を値desired
で非アトミックに初期化する。この関数は、デフォルト構築されたオブジェクトに対して一度だけ呼びださなければならない。変数の初期化中に並行アクセスされた場合、それがアトミックな操作であったとしてもデータ競合を引き起こす。
戻り値
なし
例外
投げない
備考
この関数は、C言語との互換性のために存在している。
非推奨の詳細 (C++20)
C言語との互換性のために、std::atomic
クラスのデフォルトコンストラクタはトリビアルに定義され、初期値は未規定となっていた。そのためこの関数を介してstd::atomic
オブジェクトを初期化する必要があったが、C++20からデフォルトコンストラクタが値初期化を行うようになったため、初期化のためにこの関数を使用する必要はなくなった。
例
#include <iostream>
#include <atomic>
int main()
{
std::atomic<int> x;
std::atomic_init(&x, 1);
std::cout << x.load() << std::endl;
}
出力
1
バージョン
言語
- C++11
処理系
- Clang: 3.3 ✅
- GCC:
- ICC: ??
- Visual C++: 2012 ✅, 2013 ✅