>백엔드 개발 >C++ >C 원자성 읽기-수정-쓰기 작업의 내부 재정렬이 메모리 순서에 어떤 영향을 줍니까?

C 원자성 읽기-수정-쓰기 작업의 내부 재정렬이 메모리 순서에 어떤 영향을 줍니까?

Barbara Streisand
Barbara Streisand원래의
2024-12-09 19:59:12477검색

How Do Internal Reorderings in C   Atomic Read-Modify-Write Operations Affect Memory Ordering?

메모리 순서 지정에서 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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.