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

履歴 編集

function template
<atomic>

std::atomic_compare_exchange_strong(C++11)

namespace std {
  template <class T>
  bool atomic_compare_exchange_strong(
         volatile atomic<T>* object,
         T* expected,
         T desired) noexcept;                              // (1) C++11

  template <class T>
  bool atomic_compare_exchange_strong(
         volatile atomic<T>* object,
         typename atomic<T>::value_type* expected,
         typename atomic<T>::value_type desired) noexcept; // (1) C++17

  template <class T>
  bool atomic_compare_exchange_strong(
         atomic<T>* object,
         T* expected,
         T desired) noexcept;                              // (2) C++11

  template <class T>
  bool atomic_compare_exchange_strong(
         atomic<T>* object,
         typename atomic<T>::value_type* expected,
         typename atomic<T>::value_type desired) noexcept; // (2) C++17
}

概要

強い比較でアトミックに値を入れ替える

テンプレートパラメータ制約

  • (1) :
    • C++20 : atomic<T>::is_always_lock_freetrueであること

効果

memory_order_seq_cstのメモリオーダーにしたがって現在の値objectexpectedをバイトレベルで等値比較を行う、trueである場合は現在の値をdesiredで置き換え、falseである場合はexpectedを現在の値objectで置き換える。

戻り値

等値比較の結果が返される

例外

投げない

備考

この関数は、値が交換可能な場合はCAS (compare-and-swap)操作が常に成功する。

atomic_compare_exchange_weak()はより弱い命令であり、交換可能な場合でもCAS操作が失敗する可能性がある。

通常、CAS操作は、CASが成功するまでループさせる。

しかし、もしCAS操作でSpurious Failureが発生しなければループさせる必要が無くなるといった状況であれば、atomic_compare_exchange_strong()を使うことで効率良くCASを行うことができる。

逆に言えば、そのような状況でないなら常にループでatomic_compare_exchange_weak()を利用すれば良い。

#include <iostream>
#include <atomic>

int main()
{
  {
    std::atomic<int> x(3);

    // x == expectedなので、xは2に置き換えられる
    int expected = 3;
    bool result = std::atomic_compare_exchange_strong(&x, &expected, 2);

    std::cout << std::boolalpha << result << " " << x.load() << " " << expected << std::endl;
  }
  {
    std::atomic<int> x(3);

    // x != expectedなので、expectedがxの値で置き換えられる
    int expected = 1;
    bool result = std::atomic_compare_exchange_strong(&x, &expected, 2);

    std::cout << std::boolalpha << result << " " << x.load() << " " << expected << std::endl;
  }
}

出力

true 2 3
false 3 3

バージョン

言語

  • C++11

処理系

関連項目

参照