영상에서 Herb Sutter가 메인 스레드가 작업자 스레드를 시작하는 예를 포함한 원자적 사용. 작업자는 중지 플래그를 확인하고 메인 스레드는 결국 memory_order_seq_cst를 사용하여 중지 플래그를 true로 설정합니다. Sutter는 스레드 중지 지연이 크지 않기 때문에 memory_order_relaxed로 플래그를 확인하는 것이 허용된다고 설명합니다.
중지 플래그가 memory_order_relaxed 대신 memory_order_seq_cst로 설정되는 이유에 대한 의문이 생깁니다.
stop 또는 keep_running 플래그 변경을 확인하는 지연 시간이 중요하더라도 이 시나리오에서는 더 강력한 메모리 주문으로 인해 의미 있는 지연 시간 이점이 없습니다.
ISO C 표준은 매장이 얼마나 빨리 표시되는지 또는 무엇이 이에 영향을 미칠 수 있는지 지정하지 않습니다. 구현에서는 원자 또는 동기화 작업에 의해 할당된 마지막 값이 유한한 시간 내에 다른 모든 스레드에 표시되도록 보장하기만 하면 됩니다.
스레드 간 대기 시간은 주로 구현 품질 문제입니다. 표준으로 인해 상황이 활짝 열려 있습니다. 일반적인 C 구현은 일반적으로 일부 아키텍처에 대해 asm으로 컴파일하고 하드웨어의 캐시 일관성 속성을 노출하므로 스레드 간 대기 시간이 낮아집니다.
캐시 일관성을 사용하는 실제 하드웨어에서는 저장 또는 로드에 대해 서로 다른 메모리 순서가 발생하지 않습니다. 매장을 실시간으로 더 빨리 확인할 수 있습니다. 저장소가 저장소 버퍼에서 L1d 캐시로 커밋될 때까지 기다리는 동안 이후 작업이 전역적으로 표시될 수 있는지 여부를 제어합니다.
더 강력한 명령과 장벽이 절대적 의미에서 일을 더 빨리 발생하게 만들지는 않습니다. 저장 또는 로드와 관련하여 발생하도록 허용될 때까지 다른 일을 지연시킵니다.
로드에 memory_order_relaxed 사용 다음과 같은 성능 이점이 있습니다.
정지 플래그가 자주 설정되지 않는 이 특정 시나리오에서는 잘못된 로드로 인해 낭비되는 작업이 다음과 같습니다. 최소한. 따라서 memory_order_relaxed를 사용하면 성능상의 이점이 잠재적인 단점보다 더 큽니다.
위 내용은 memory_order_relaxed로 확인하면 왜 memory_order_seq_cst를 사용하여 중지 플래그를 설정합니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!