ARM 및 x86-64: 보장된 원자 유형 없음
초기 가정과 달리 C/C 언어 표준은 다음을 보장하지 않습니다. 64비트에서도 특정 데이터 유형에 대한 원자적 연산
신호와 스레드를 통한 원자 액세스
두 가지 원자성 개념을 구별하는 것이 중요합니다.
GCC ARM 및 x86-64에서 구현
ARMv8 및 x86-64와 같은 최신 CPU는 x86-64는 특정 작업에 대한 원자 액세스를 보장할 수 있지만 이러한 보장은 언어 수준에서는 반영되지 않습니다. GCC 및 기타 컴파일러는 다음 예에서 볼 수 있듯이 이러한 하드웨어 수준 원자성을 위반하는 방식으로 코드를 최적화할 수 있습니다.
volatile uint32_t x; uint32_t foo(void) { return (x >> 8) & 0xffff; }
x가 32비트 변수이더라도 GCC는 foo를 두 개의 별도 16으로 컴파일합니다. -비트 로드. x가 동시에 수정되면 비원자적 읽기가 발생할 수 있습니다.
다음에 의존합니다. std::atomic 또는 _Atomic
C 및 C에서 원자성 작업을 보장하는 유일한 방법은 필요한 동기화를 제공하는 std::atomic(C) 또는 _Atomic(C) 유형을 명시적으로 사용하는 것입니다. 스레드로부터 안전한 액세스를 보장하는 메커니즘.
위 내용은 C/C 표준은 ARM 및 x86-64 아키텍처의 모든 데이터 유형에 대한 원자적 연산을 보장합니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!