C Language
원자 공학
수색…
통사론
-
#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++;
아르.