메모리 순서 지정에서 RMW(원자적 읽기-수정-쓰기) 작업 처리
원자적 읽기의 특성에 대한 질문에 대한 응답 -수정-쓰기(RMW) 작업, C 표준은 이를 획득과 해제를 모두 결합한 의미론을 사용하여 단일 작업으로 분류합니다.
주문 의미
이 지정은 동일한 스레드에서 발생하는 메모리 읽기 또는 쓰기가 RMW 작업 전후에 재정렬될 수 없음을 의미합니다. 그러나 RMW의 내부 읽기 및 쓰기 구성 요소 간의 재정렬 가능성을 배제하지는 않습니다.
구체적인 예
제공된 코드 예를 고려하세요.
std::atomic<int> x, y; void thread_A() { x.exchange(1, std::memory_order_acq_rel); y.store(1, std::memory_order_relaxed); } void thread_B() { int yy = y.load(std::memory_order_acquire); int xx = x.load(std::memory_order_acquire); std::cout << xx << ", " << yy << std::endl; }
이 시나리오에서 스레드 B는 실제로 0, 1을 출력할 수 있습니다. 이는 스레드 B 내에서 로드 및 저장 작업이 수행되기 때문입니다. 스레드 A의 RMW 작업은 내부적으로 재정렬될 수 있으므로 스레드 B는 로드 후(0), 저장 전(1)의 상태를 관찰할 수 있습니다.
ARM64 구현
ldaxr, stlxr 및 str 명령어에 설명된 대로 RMW 작업의 ARM64 구현은 표준 기대치에 부합합니다. str 명령은 stlxr 명령 앞에 표시될 수 있으며 잠재적으로 스레드 B에 의해 0, 1이 관찰될 수 있습니다.
메모리 순서 의미
memory_order_acq_rel을 seq_cst로 바꾸면 다른 seq_cst 작업과 관련된 추가 의미 체계만 도입하므로 이 동작에 영향을 미치지 않습니다. 코드 예제에 있습니다.
결론
C의 원자 RMW 연산은 획득-해제 의미 체계를 사용하는 단일 연산입니다. 외부 작업 전후의 재정렬을 방지하는 반면, 내부 구성 요소 간의 재정렬 가능성은 스레드 B가 0, 1을 출력할 수 있는 코드 예제와 같은 시나리오를 허용합니다.
위 내용은 C 원자성 읽기-수정-쓰기 작업의 내부 재정렬이 메모리 순서에 어떤 영향을 줍니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!