수색…


통사론

  • #ifdef __STDC_NO_ATOMICS__
  • # error this implementation needs atomics
  • #endif
  • #include <stdatomic.h>
  • 부호없는 _Atomic 카운터 = ATOMIC_VAR_INIT (0);

비고

C 언어의 일부인 Atomics는 C11부터 사용할 수있는 선택적 기능입니다.

그들의 목적은 다른 스레드간에 공유되는 변수에 대한 인종없는 액세스를 보장하는 것입니다. 원자 적격이 없으면 두 개의 스레드가 동시에 액세스 할 경우 공유 변수의 상태는 정의되지 않습니다. 예를 들어 증분 연산 ( ++ )은 여러 어셈블러 명령어, 읽기, 추가 자체 및 저장 명령어로 나눌 수 있습니다. 다른 스레드가 동일한 작업을 수행하는 경우 두 스레드의 명령 시퀀스가 ​​서로 얽혀 일관성없는 결과가 발생할 수 있습니다.

  • 유형 : 배열 유형을 제외한 모든 오브젝트 유형은 _Atomic 으로 규정 될 수 있습니다.

  • 연산자 : 이것들에 대한 모든 읽기 - 수정 - 쓰기 연산자 (예 : ++ 또는 *= )는 원자 적으로 보장됩니다.

  • 연산 : atomic_compare_exchange 와 같이 유형 제네릭 함수로 지정된 다른 연산이 있습니다.

  • 스레드 : 다른 스레드가 액세스 할 때 데이터 경합이 발생하지 않도록 액세스가 보장됩니다.

  • 시그널 핸들러 : 원자 타입은 그것들에 대한 모든 연산이 무 상태 인 경우 잠금없는 것으로 불린다. 이 경우 정상적인 제어 흐름과 신호 처리기간에 상태 변경을 처리하는 데 사용할 수도 있습니다.

  • lock-free가 보장되는 데이터 유형은 atomic_flag . 이것은 효율적인 테스트 및 설정 하드웨어 지침에 매핑하려는 작업을 수행하는 최소 유형입니다.

경쟁 조건을 피하는 다른 방법은 C11의 스레드 인터페이스에서 사용할 수 있습니다. 특히 스레드가 중요한 데이터 나 코드의 중요 섹션에 액세스하지 못하도록 mutex 형식 인 mtx_t 를 사용할 수 있습니다. 원자가를 사용할 수 없으면 인종을 방지하기 위해 사용되어야합니다.

원자학 및 운영자

경쟁 변수를 만들지 않고도 서로 다른 스레드간에 원자 변수를 동시에 액세스 할 수 있습니다.

/* a global static variable that is visible by all threads */
static unsigned _Atomic active = ATOMIC_VAR_INIT(0);


int myThread(void* a) {
  ++active;         // increment active race free
  // do something
  --active;         // decrement active race free
  return 0;
}

기본 유형에 허용되는 모든 lvalue 연산 (객체를 수정하는 연산)은 허용되며, 액세스하는 다른 스레드 사이의 경쟁 조건으로 연결되지 않습니다.

  • 원자 물체에 대한 연산은 일반적으로 일반적인 산술 연산보다 느리게 진행됩니다. 여기에는 단순한로드 또는 저장 조작도 포함됩니다. 따라서 중요한 작업에만 사용해야합니다.
  • 일반적인 산술 연산과 a = a+1; 사실상 세 가지 작업이 a : 먼저로드, 추가 및 마지막으로 저장소. 이것은 경주가 무료가 아닙니다 . 오직 a += 1;a++; 아르.


Modified text is an extract of the original Stack Overflow Documentation
아래 라이선스 CC BY-SA 3.0
와 제휴하지 않음 Stack Overflow