atomic_ref

atomic_ref (참조 대상에 원자 연산 적용)

기존 객체를 참조하면서 그 객체에 원자 연산을 적용하게 해주는 클래스 템플릿이에요. 새 객체를 만들지 않고 이미 있는 변수를 원자적으로 다루고 싶을 때 써요. <atomic> 헤더, C++20부터.

출처: cppreference

본문

std::atomic_ref 클래스 템플릿은 참조하는 객체에 원자 연산을 적용해요.

template< class T >
struct atomic_ref;

std::atomic_ref 객체가 살아 있는 동안, 그것이 참조하는 객체는 원자 객체로 간주돼요. 한 스레드가 atomic 객체에 쓰는 동안 다른 스레드가 읽어도 동작이 잘 정의돼요(데이터 경쟁은 메모리 모델 참고). 또한 atomic 접근은 스레드 간 동기화를 만들고 std::memory_order가 지정한 대로 비원자적 메모리 접근에도 순서를 부여할 수 있어요.

핵심 제약을 정리하면:

  • 참조 대상 객체의 수명은 그 객체를 참조하는 모든 atomic_ref의 수명보다 길어야 해요.
  • 어떤 객체를 참조하는 atomic_ref 인스턴스가 존재하는 동안, 그 객체는 반드시 이 atomic_ref 인스턴스들로만 배타적으로 접근해야 해요.
  • 참조 대상 객체의 하위 객체(subobject)는 어떤 atomic_ref로도 참조할 수 없어요.

std::atomic<T>가 값(자체 소유)에 대한 원자 타입이라면, std::atomic_ref<T>이미 존재하는 객체에 대한 원자 뷰를 제공해요. 그래서 수명이 긴 객체나 외부에서 관리되는 메모리에 원자성을 부여하고 싶을 때 유용하죠. 멤버 함수(load, store, fetch_add, compare_exchange 등)는 std::atomic과 거의 동일해요.

더 알아보기 (Learn more)

cppreference