atomic_atomic_compare_exchange

atomic_atomic_compare_exchange (비교 후 교환)

std::atomic_compare_exchange_weakstd::atomic_compare_exchange_strong은 원자적으로 객체의 현재 값을 기대값과 비교해 같으면 원하는 값으로 바꾸고, 다르면 기대값을 현재 값으로 갱신해요. CAS(Compare-And-Swap) 연산이에요.

출처: cppreference

본문

std::atomic_compare_exchange_weakstd::atomic_compare_exchange_strong<atomic> 헤더에 정의된 자유 함수(free function)예요.

template< class T >
bool atomic_compare_exchange_weak
    ( std::atomic<T>* obj, typename std::atomic<T>::value_type* expected,
      typename std::atomic<T>::value_type desired ) noexcept;

template< class T >
bool atomic_compare_exchange_strong
    ( std::atomic<T>* obj, typename std::atomic<T>::value_type* expected,
      typename std::atomic<T>::value_type desired ) noexcept;
  • atomic_compare_exchange_strongobj가 가리키는 객체의 현재 값이 expected가 가리키는 값과 같으면 desired로 바꾸고 true를 반환해요. 다르면 expected가 가리키는 값을 현재 값으로 갱신하고 false를 반환해요 (read-modify-write 연산).
  • atomic_compare_exchange_weakatomic_compare_exchange_strong과 비슷하지만 가끔 실패(spurious failure)할 수 있어요. 루프 안에서 재시도할 때 주로 써요.

비교는 객체와 expected의 값 표현(value representation)이 비트 단위로 같은지 검사해요. std::atomic<T>::value_type은 trivially copyable이어야 해요.

예제 (Example)

#include <atomic>

std::atomic<bool> flag{true};
int main()
{
    bool expected = true;
    bool old = flag;
    // flag가 expected와 같으면 false로 바꾼다
    bool swapped = atomic_compare_exchange_strong(&flag, &expected, false);
}

더 알아보기 (Learn more)

cppreference