Skip to content

Latest commit

 

History

History
141 lines (107 loc) · 4.78 KB

atomic_compare_exchange_strong.md

File metadata and controls

141 lines (107 loc) · 4.78 KB

atomic_compare_exchange_strong

  • atomic[meta header]
  • std[meta namespace]
  • function template[meta id-type]
  • cpp11[meta cpp]
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
  template <class T>
  constexpr bool
    atomic_compare_exchange_strong(
         atomic<T>* object,
         typename atomic<T>::value_type* expected,
         typename atomic<T>::value_type desired) noexcept; // (2) C++26
}
  • atomic[link atomic.md]

概要

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

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

  • (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;
  }
}
  • std::atomic_compare_exchange_strong[color ff0000]
  • x.load()[link /reference/atomic/atomic/load.md]

出力

true 2 3
false 3 3

バージョン

言語

  • C++11

処理系

関連項目

参照