>백엔드 개발 >C++ >하나의 스레드가 C 11 원자 변수에서 오래된 데이터를 읽을 수 있습니까?

하나의 스레드가 C 11 원자 변수에서 오래된 데이터를 읽을 수 있습니까?

DDD
DDD원래의
2024-12-13 17:53:10301검색

Can One Thread Read Stale Data from a C  11 Atomic Variable?

동시성: C 11 메모리 모델의 원자성과 휘발성 이해

서로 다른 코어에서 동시에 실행되는 여러 스레드가 액세스하는 전역 변수를 생각해 보세요. 각 스레드는 변수에 쓰고 읽을 수 있습니다. 하나의 스레드가 원자 변수에서 오래된 정보를 읽을 수 있습니까?

휘발성과 원자: 구별

원자는 원자 액세스를 의미하지만 휘발성만으로는 그렇지 않습니다. Volatile은 메모리 매핑된 I/O 및 신호 처리와 같은 상황에서 사용됩니다. std::atomic과 쌍을 이루면 중복됩니다. 게다가 원자 액세스 또는 스레드 간 메모리 순서와 관련이 없습니다.

원자 변수를 사용한 메모리 순서 지정

C 11의 std::atomic 라이브러리는 다음을 제공합니다. 원자 정수형,

 std::atomic; 일체 포함; 
가시성 및 순서 제한은 작업에 제공되는 메모리 순서에 따라 다릅니다.

  • 순서 일관성 순서(std::memory_order_seq_cst): 전체 작업에 걸쳐 단일 전체 순서를 유지합니다. 모든 변수. 오래된 값이 없다는 것을 보장하지는 않지만, 얻은 값이 순서에서 작업 위치를 결정하고 결정되도록 보장합니다.
  • 완화된 순서 지정(std::memory_order_relaxed): 모든 순서를 제거합니다. 최적의 속도를 허용하지만 예측할 수 없는 실행 위험이 있는 제약 조건 order.

RMW(읽기-수정-쓰기) 작업: 최신성 보장

exchange(), Compare_exchange_strong() 및 fetch_add(와 같은 RMW 작업 ), 보증을 제공합니다. 항상 가장 최근 값에 따라 작동합니다. 여러 스레드에서 ai.fetch_add(1)에 대한 일련의 호출에서는 중복되거나 누락된 숫자가 반환되지 않습니다. 그러나 스레드는 서로 다른 시점의 값을 볼 수 있습니다.

주의 및 결론

원자적 연산을 이해하는 것이 중요합니다. 프로덕션 코드에서 사용하기 전에 철저한 조사와 코드 검토가 권장됩니다. 잠금은 종종 동시성에 대한 더 접근하기 쉽고 효율적인 접근 방식을 제공합니다.

위 내용은 하나의 스레드가 C 11 원자 변수에서 오래된 데이터를 읽을 수 있습니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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