메모리 순서의 맥락에서 원자적 읽기-수정-쓰기(RMW) 동작 std::memory_order_acq_rel을 사용하는 x.exchange(...)와 같은 작업은 다음과 같은 질문을 제기합니다. 이 작업이 처리됩니까? 획득-릴리스 의미 체계를 갖춘 단일 엔터티로 또는 획득 로드와 릴리스 저장소로 구성된 일련의 작업으로 구성됩니까?
표준 관점: 단일 작업
에 따르면 C 표준에서는 RMW 작업이 단일 작업으로 간주됩니다. 이러한 의미는 단수형을 사용하는 이름과 표준 관련 표현에서 비롯됩니다. 따라서 이 맥락에서 x.exchange(...) 작업은 단일 엔터티로 간주됩니다.
주문 의미: 잠재적 재정렬
표준의 관점에서 보면 제공된 코드는 0, 1을 출력할 가능성이 있습니다. 이러한 가능성은 표준이 작업 재정렬 측면에서 정의되지 않고 오히려 동기화 측면에서 정의되기 때문에 발생합니다. 릴리스 및 획득 작업 간의 관계.
구체적으로 y.load(acquire) 작업에는 일치하는 릴리스 또는 더 강한 저장소가 없습니다. 따라서 다른 작업과 동기화되지 않으며 완화된 로드(y.load(relaxed))로 효과적으로 처리됩니다.
또한 x.exchange(1, acq_rel) 작업의 "acquire" 구성 요소는 동기화되지 않습니다. 동기화할 저장소가 없으므로 획득 의미 체계가 효과적으로 완화됩니다. 이는 x.store(1, release) 작업으로 효과적으로 변환됩니다.
각 스레드의 x에 대한 저장 전과 로드 후에는 작업이 없으므로 이러한 작업 간의 잠재적인 동기화가 중복됩니다. 결과적으로 두 로드 모두 0 또는 1을 반환할 수 있으므로 출력 0, 1이 허용됩니다.
결론
C 표준의 관점에서 원자 읽기- 수정-쓰기 작업은 단일 작업으로 간주됩니다. 이러한 이해는 제공된 예에서 로드와 저장소 간의 동기화 부족으로 인해 코드가 0, 1을 인쇄할 가능성이 있음을 의미합니다.
위 내용은 원자적 읽기-수정-쓰기는 단일 작업입니까 아니면 일련의 획득-해제 작업입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!