atomic_exchange
atomic_exchange (원자적으로 값 교체하기)
atomic 객체의 값을 새 값으로 원자적으로 교체하면서, 교체 전의 이전 값을 반환하는 연산이에요. <atomic> 헤더, C++11부터.
출처: cppreference
본문
atomic_exchange는 obj가 가리키는 값을 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와 달리 값 비교 없이 무조건 교체한다는 점이 차이예요.