atomic_exchange

atomic_exchange (원자적으로 값 교체하기)

atomic 객체의 값을 새 값으로 원자적으로 교체하면서, 교체 전의 이전 값을 반환하는 연산이에요. <atomic> 헤더, C++11부터.

출처: cppreference

본문

atomic_exchangeobj가 가리키는 값을 desired로 원자적으로 바꾸고, 그 전에 obj가 들고 있던 값을 돌려줘요.

template< class T >
T atomic_exchange( std::atomic<T>* obj,
                   typename std::atomic<T>::value_type desired ) noexcept;   // (1)

기본 버전은 obj->exchange(desired)처럼 동작해요. 읽기-쓰기(RMW)를 하나의 원자 연산으로 수행하므로 중간에 다른 스레드가 끼어들 수 없어요.

_explicit 버전은 메모리 순서를 직접 지정해요.

template< class T >
T atomic_exchange_explicit( std::atomic<T>* obj,
                            typename std::atomic<T>::value_type desired,
                            std::memory_order order ) noexcept;   // (3)
  • 기본 메모리 순서는 std::memory_order_seq_cst예요.
  • volatile 버전도 제공돼요.

전형적인 용도는 "이전 값을 꺼내면서 새 값으로 갱신"이에요. 예를 들어 최근 가장 최신 값 표시를 스레드 안전하게 바꿀 때, 또는 이전 상태를 읽어가며 상태 기계를 전이할 때 유용해요. compare_exchange와 달리 값 비교 없이 무조건 교체한다는 점이 차이예요.

더 알아보기 (Learn more)

cppreference