atomic_fetch_add

atomic_fetch_add (원자적으로 더하기)

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

출처: cppreference

본문

atomic_fetch_addobj가 가리키는 값에 arg를 원자적으로 더하고, 더하기 전에 obj가 들고 있던 값을 돌려줘요.

template< class T >
T atomic_fetch_add( std::atomic<T>* obj,
                    typename std::atomic<T>::difference_type arg ) noexcept;   // (1)

arg의 타입이 value_type이 아니라 difference_type이라는 점이 특징이에요. 포인터 특수화에서는 difference_type(보통 std::ptrdiff_t)이라 포인터 산술처럼 요소 개수를 더할 수 있어요.

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

template< class T >
T atomic_fetch_add_explicit( std::atomic<T>* obj,
                             typename std::atomic<T>::difference_type arg,
                             std::memory_order order ) noexcept;   // (3)
  • 읽기-수정-쓰기(RMW)를 하나의 원자 연산으로 수행해요.
  • 기본 메모리 순서는 std::memory_order_seq_cst예요.

가장 흔한 예가 스레드 안전 카운터예요. 여러 스레드가 동시에 fetch_add를 호출해도 결과가 항상 정합적이에요.

std::atomic<int> counter{0};
int before = std::atomic_fetch_add(&counter, 1);  // 이전 값 0을 얻고 1 증가

자유 함수 버전과 멤버 버전(counter.fetch_add(1))이 기능상 같고, 멤버 버전이 더 자주 쓰여요.

더 알아보기 (Learn more)

cppreference