atomic

atomic (std::atomic — 원자적 타입)

스레드 간에 안전하게 공유할 수 있는 원자적(atomic) 타입을 정의하는 템플릿이에요. 한 스레드가 쓰는 동안 다른 스레드가 읽어도 데이터 경쟁 없이 잘 정의된 동작을 보장해요. <atomic> 헤더, C++11부터 있어요.

출처: cppreference

본문

std::atomic 템플릿의 각 인스턴스화(그리고 전체 특수화)는 하나의 원자적 타입을 정의해요.

template< class T > struct atomic;      // (1)

template< class U > struct atomic<U*>;  // (2) 포인터 특수화

포인터 특수화는 C++11부터, C++20부터는 <memory>std::shared_ptr/std::weak_ptr 특수화도 생겼어요. C++23부터 <stdatomic.h>_Atomic(T) 매크로도 정의돼요.

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

원자 연산의 종류를 정리하면:

  • Store(저장): 쓰기.
  • Load(읽기): 읽기.
  • Read-modify-write (RMW): 읽고 다시 쓰기. 주의—이건 하나의 원자 연산이지, 여러 연산이 아니에요.

모든 원자 연산에는 메모리 순서가 있고, 기본값은 std::memory_order_seq_cst(순차 일관성)예요. RMW 연산의 예로는 fetch_add, exchange, compare_exchange 등이 있고, 자료구조(예: spinlock, 무잠금 데이터 구조)를 만들 때 핵심 도구로 쓰여요.

std::atomic은 기본적으로 무잠금(lock-free)일 수 있고, is_lock_free()로 확인할 수 있어요. 핵심 타입(int, bool, 포인터 등)은 거의 항상 무잠금으로 구현돼요.

더 알아보기 (Learn more)

cppreference