cppreference.com 의 설명서std::memory_order
에는 완화 된 주문의 예가 있습니다.
편안한 주문
태그
memory_order_relaxed
가 지정된 원자 작업 은 동기화 작업이 아닙니다. 동시 메모리 액세스간에 순서를 부과하지 않습니다. 원 자성 및 수정 순서 일관성 만 보장합니다.예를 들어 x와 y가 처음에 0 인 경우
// Thread 1: r1 = y.load(std::memory_order_relaxed); // A x.store(r1, std::memory_order_relaxed); // B // Thread 2: r2 = x.load(std::memory_order_relaxed); // C y.store(42, std::memory_order_relaxed); // D
스레드 1 내에서 A가 B 보다 먼저 시퀀싱 되고 스레드 2 내에서 D 보다 먼저 C가 시퀀싱 되기는하지만 , y의 수정 순서에서 D가 D보다 먼저 나타나는 것을 막을 수 는 없기 때문에 r1 == r2 == 42 생성 x의 수정 순서에서 C 앞에 나타납니다. y에 대한 D의 부작용은 나사산 1의 하중 A에서 볼 수 있지만 x에 대한 B의 부작용은 나사산 2의 하중 C에서 볼 수 있습니다. 특히, C in 전에 D가 완료된 경우 발생할 수 있습니다. 컴파일러 재정렬로 인해 또는 런타임에 스레드 2
"C는 스레드 2 내에서 D보다 먼저 시퀀싱됩니다"라고 표시됩니다.
평가 순서 에서 찾을 수있는 이전 순서의 정의에 따라 A가 B보다 먼저 순서화되면 B의 평가가 시작되기 전에 A의 평가가 완료됩니다. C는 스레드 2 내에서 D보다 먼저 시퀀싱되므로 D가 시작되기 전에 C를 완료해야하므로 스냅 샷의 마지막 문장의 조건 부분은 절대 충족되지 않습니다.