원자 변수 초기화 매크로: ATOMIC_VAR_INIT(C11)
원자 변수 초기화 매크로: ATOMIC_VAR_INIT(C11)
원자 변수를 선언할 때 초기값을 어떻게 넣을까 고민하다 보면, 보통의 대입과는 뭔가 다른 게 필요해 보일 수 있어요. 초창기 C11 설계에는 그런 용도를 위한 매크로가 있었는데, 그것이 **ATOMIC_VAR_INIT**예요. 다만 이 매크로는 지금은 역사적인 의미만 남아 있어요.
출처: cppreference
본문
정의
<stdatomic.h> 헤더에 이렇게 정의돼 있어요.
| 형태 |
|---|
#define ATOMIC_VAR_INIT(value) /* unspecified */ |
동작 방식
value와 같은 타입의 원자 변수를 초기화하는 데 쓸 수 있는 표현식으로 확장돼요.
자동 저장 수명(auto storage duration)을 가진 원자 객체를 명시적으로 초기화하지 않으면 초기값은 불확정이에요. 다만 정적(static)이나 스레드 지역(thread-local) 변수는 기본(영) 초기화가 유효한 값을 만들어 주죠.
그런데 주의할 점이 있어요. 원자 변수를 초기화하는 동안 어떤 동시 접근이 일어나면, 비록 원자 연산을 통하더라도 데이터 경쟁(data race)이 돼요. 예를 들어 초기화 직후 그 주소를 memory_order_relaxed 연산으로 다른 스레드에 넘겨주는 경우가 그렇죠. 초기화 자체를 원자적으로 취급하지 않기 때문이에요.
주의할 점
이 매크로는 C11 원자 타입의 초창기 설계 초안에 포함됐던 것이에요. 하지만 C11에서 실제로 필요하지는 않게 됐고, C17에서 폐기(deprecated)됐으며 C23에서 제거됐어요. 그래서 새 코드에서 이걸 쓸 일은 사실상 없어요.
결함 보고
이 매크로에는 표준 결함 보고가 적용됐어요.
| DR | 적용 대상 | 발표된 동작 | 올바른 동작 |
|---|---|---|---|
| DR 485 | C11 | 사양이 중복되고 핵심 언어와 모순됨 | 수정됨 |
더 알아보기
ATOMIC_FLAG_INIT:atomic_flag초기화 매크로._Atomic한정자와 원자 타입.