>백엔드 개발 >C++ >memory_order_relaxed로 확인하면 왜 memory_order_seq_cst를 사용하여 중지 플래그를 설정합니까?

memory_order_relaxed로 확인하면 왜 memory_order_seq_cst를 사용하여 중지 플래그를 설정합니까?

DDD
DDD원래의
2024-11-11 15:22:03599검색

Why set the stop flag using memory_order_seq_cst, if you check it with memory_order_relaxed?

memory_order_relaxed로 확인한 경우 왜 memory_order_seq_cst를 사용하여 중지 플래그를 설정합니까?

영상에서 Herb Sutter가 메인 스레드가 작업자 스레드를 시작하는 예를 포함한 원자적 사용. 작업자는 중지 플래그를 확인하고 메인 스레드는 결국 memory_order_seq_cst를 사용하여 중지 플래그를 true로 설정합니다. Sutter는 스레드 중지 지연이 크지 않기 때문에 memory_order_relaxed로 플래그를 확인하는 것이 허용된다고 설명합니다.

중지 플래그가 memory_order_relaxed 대신 memory_order_seq_cst로 설정되는 이유에 대한 의문이 생깁니다.

mo_relaxed는 정류장의 로드 및 저장 모두에 적합합니다. 플래그

stop 또는 keep_running 플래그 변경을 확인하는 지연 시간이 중요하더라도 이 시나리오에서는 더 강력한 메모리 주문으로 인해 의미 있는 지연 시간 이점이 없습니다.

ISO C 표준은 매장이 얼마나 빨리 표시되는지 또는 무엇이 이에 영향을 미칠 수 있는지 지정하지 않습니다. 구현에서는 원자 또는 동기화 작업에 의해 할당된 마지막 값이 유한한 시간 내에 다른 모든 스레드에 표시되도록 보장하기만 하면 됩니다.

스레드 간 대기 시간은 주로 구현 품질 문제입니다. 표준으로 인해 상황이 활짝 열려 있습니다. 일반적인 C 구현은 일반적으로 일부 아키텍처에 대해 asm으로 컴파일하고 하드웨어의 캐시 일관성 속성을 노출하므로 스레드 간 대기 시간이 낮아집니다.

캐시 일관성을 사용하는 실제 하드웨어에서는 저장 또는 로드에 대해 서로 다른 메모리 순서가 발생하지 않습니다. 매장을 실시간으로 더 빨리 확인할 수 있습니다. 저장소가 저장소 버퍼에서 L1d 캐시로 커밋될 때까지 기다리는 동안 이후 작업이 전역적으로 표시될 수 있는지 여부를 제어합니다.

더 강력한 명령과 장벽이 절대적 의미에서 일을 더 빨리 발생하게 만들지는 않습니다. 저장 또는 로드와 관련하여 발생하도록 허용될 때까지 다른 일을 지연시킵니다.

로드에 memory_order_relaxed를 사용하는 경우의 성능 이점>

로드에 memory_order_relaxed 사용 다음과 같은 성능 이점이 있습니다.

  • 불필요한 대기를 방지합니다. 검사가 완료되도록 하여 로드가 거짓을 생성할 때 루프 반복 전반에 걸쳐 더 많은 명령어 수준 및 메모리 수준 병렬 처리를 허용합니다.
  • 획득 또는 SC 로드에 추가 명령어가 필요한 ISA에 대한 추가 명령어(예: 2)를 방지합니다. 일부 아키텍처에서는 -way 장벽 지침이 있습니다.

정지 플래그가 자주 설정되지 않는 이 특정 시나리오에서는 잘못된 로드로 인해 낭비되는 작업이 다음과 같습니다. 최소한. 따라서 memory_order_relaxed를 사용하면 성능상의 이점이 잠재적인 단점보다 더 큽니다.

위 내용은 memory_order_relaxed로 확인하면 왜 memory_order_seq_cst를 사용하여 중지 플래그를 설정합니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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