memory_order

memory_order (메모리 순서 열거형)

원자 연산이 부여하는 메모리 순서 보장을 나타내는 열거형이에요. <atomic> 헤더, C++11부터.

출처: cppreference

본문

std::memory_order는 atomic 연산의 메모리 순서를 지정하는 열거형이에요.

enum memory_order {
    relaxed, consume, acquire, release, acq_rel, seq_cst
};

(C++20부터 consume은 일부 문맥에서 제한되고 release/acquire 계열이 강조돼요.)

각 값의 의미를 정리하면:

  • relaxed: 순서 보장 없음. 원자성만 유지해요.
  • consume: 의존성을 기반으로 하는 약한 acquire(C++20에서 제한).
  • acquire: 이후 읽기/쓰기가 이 연산 앞으로 옮겨지지 않게 해요. release와 짝을 이뤄 동기화해요.
  • release: 이전의 모든 쓰기가 연산 뒤로 넘어가지 않게 게시(publish)해요.
  • acq_rel: acquire와 release를 모두 수행하는 읽기-수정-쓰기용.
  • seq_cst: 전역 단일 순서(순차 일관성)를 보장해요. 기본값이며 가장 강력해요.
std::atomic<bool> flag{false};
int data = 0;
// 생산자
data = 42;                                // (1)
flag.store(true, std::memory_order_release);  // (2)
// 소비자
while (!flag.load(std::memory_order_acquire)) {}  // (3)
std::cout << data;   // 항상 42

release-acquire 짝으로 (1)의 data 쓰기가 소비자에게 안전하게 보여요. seq_cst를 쓰면 이해하기 쉽지만, 무거울 수 있어서 고성능 저수준 코드에서 relaxed/acquire/release를 골라 써요.

더 알아보기 (Learn more)

cppreference