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를 골라 써요.