atomic_fetch_and

atomic_fetch_and (원자적으로 비트 AND)

atomic 객체의 값과 인자를 비트 AND한 결과로 원자적으로 교체하고, 이전 값을 반환하는 연산이에요. <atomic> 헤더, C++11부터.

출처: cppreference

본문

atomic_fetch_andobj가 가리키는 값을, 그 이전 값과 arg비트 AND 결과로 원자적으로 교체하고, 이전 값을 돌려줘요.

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

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

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

비트 단위 연산이라 플래그를 지울 때 자주 쓰여요. 예를 들어 어떤 상태 플래그의 특정 비트를 끄는 게 여러 스레드에서 안전하게 일어나야 할 때요.

std::atomic<int> flags{0b1111};
std::atomic_fetch_and(&flags, 0b1110);  // 최하위 비트를 0으로

자유 함수 버전과 멤버 버전(flags.fetch_and(...))이 동일하게 동작해요. OR(fetch_or)와 함께 비트 조작을 무잠금으로 할 때 쓰이죠.

더 알아보기 (Learn more)

cppreference