memory_order_relaxed로 확인하면서 중지 플래그 설정에 memory_order_seq_cst를 활용하는 이유는 무엇입니까?
Herb Sutter는 원자 연산에 대한 논의에서 사용 예를 제시합니다. 중지 플래그 메커니즘을 포함한 원자적 요소:
작업자 스레드는 지속적으로 중지 플래그를 확인합니다.
while (!stop.load(std::memory_order_relaxed)) { // Do stuff. }
스토어 운영에서 완화를 사용하지 않는 이유
Herb는 대기 시간이 최소화되므로 플래그 확인을 위해 memory_order_relaxed를 사용하는 것이 허용된다고 제안하지만 대기 시간이 우선순위인 경우에도 더 엄격한 메모리 순서를 사용하는 경우에는 눈에 띄는 성능 이점이 없습니다.
그렇지 않은 이유 매장 운영 시 여유로운 사용이 불분명한데, 아마도 감독이나 개인 선호로 인해 그럴 수 있습니다.
대기 시간 고려 사항
ISO C 표준은 매장 가시성을 위해 특정 기간을 시행하지 않습니다. 또는 영향을 미치는 방법에 대한 지침을 제공하십시오. 이러한 조항은 완화된 작업을 포함하여 모든 원자 작업에 적용됩니다. 그러나 구현에서는 합리적인 시간 내에 원자 로드에 액세스할 수 있는 저장 값을 만드는 것이 좋습니다.
실제로 특정 대기 시간은 구현에 따라 결정되며 하드웨어 캐시 일관성 메커니즘은 일반적으로 최고 수준에서 수십 나노초 이내의 가시성을 허용합니다. 최악의 경우에 가까운 시나리오 및 마이크로초 미만의 간격.
메모리 순서 의미
저장 또는 로드 작업에 대한 서로 다른 메모리 순서는 실제 저장을 신속하게 처리하지 않습니다. 시간이 지나면 상점이 보류 중인 동안 후속 작업이 전역적으로 표시될 수 있는지 여부만 제어할 뿐입니다.
본질적으로 더 강력한 주문과 장벽은 이벤트를 절대적으로 가속화하지 않고 오히려 상점이나 로드가 완료될 때까지 다른 작업을 연기합니다. 이는 저장소가 다른 코어에 즉시 표시되도록 노력하는 모든 실제 CPU에 해당됩니다.
따라서 seq_cst를 사용하는 등 메모리 순서를 늘리면 중지 플래그에 대한 변경 사항이 작업자에게 즉시 표시됩니다. 스레드를 사용하여 신속한 종료를 보장합니다. 그러나 실제 가시성 대기 시간에는 영향을 미치지 않습니다.
완화 검사의 이점
검사 작업에 memory_order_relaxed를 사용하면 다음과 같은 몇 가지 장점이 있습니다.
추가 고려 사항
Herb는 thread.join에서 제공하는 동기화로 인해 더티 플래그에 완화된 사용도 허용된다는 것을 올바르게 식별합니다. 그러나 더티에는 동일한 값의 동시 쓰기를 방지하기 위해 원자성이 필요하다는 점에 유의해야 합니다. 이는 여전히 ISO C 표준에 따라 데이터 경쟁으로 간주됩니다.
결론적으로 중지 플래그 설정을 위해 memory_order_seq_cst를 사용하는 동안 즉시 보장됩니다. 작업자 스레드에 대한 가시성은 로드 작업에 대해 지나치게 완화해도 성능상의 이점이 없습니다. memory_order_relaxed는 명령 수준 병렬 처리 및 메모리 대역폭 활용 측면에서 이점을 제공하므로 이러한 시나리오에서 선호되는 선택입니다.
위 내용은 중지 플래그를 설정하는 데 `memory_order_seq_cst`를 사용하고 확인하는 데 `memory_order_relaxed`를 사용하는 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!