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과 거의 동일해요.