最終更新日時(UTC):
が更新

履歴 編集

function template
<atomic>

std::atomic_init(C++11)(C++20で非推奨)

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_freetrueであること

効果

この関数は、アトミックオブジェクト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

処理系

関連項目

参照