락 프리 여부 매크로: ATOMIC_*_LOCK_FREE(C11)
락 프리 여부 매크로: ATOMIC_*_LOCK_FREE(C11)
원자 타입이 실제로 락을 쓰지 않고 구현되는지, 아니면 내부적으로 락을 거는지는 타입과 플랫폼에 따라 달라져요. 그 성질을 알려 주는 매크로들이 ATOMIC_*_LOCK_FREE 상수예요. 보통의 원자 연산이 항상 성공할지를 코드 작성 시점에 미리 파악할 때 쓰입니다.
출처: cppreference
본문
정의
<stdatomic.h> 헤더에 정의돼 있고, 구현이 정의하는 값(implementation-defined)으로 확장돼요. 부호 있는 타입과 부호 없는 타입 모두에 대해 각각 존재합니다.
| 매크로 |
|---|
ATOMIC_BOOL_LOCK_FREE |
ATOMIC_CHAR_LOCK_FREE |
ATOMIC_CHAR16_T_LOCK_FREE |
ATOMIC_CHAR32_T_LOCK_FREE |
ATOMIC_WCHAR_T_LOCK_FREE |
ATOMIC_SHORT_LOCK_FREE |
ATOMIC_INT_LOCK_FREE |
ATOMIC_LONG_LOCK_FREE |
ATOMIC_LLONG_LOCK_FREE |
ATOMIC_POINTER_LOCK_FREE |
ATOMIC_CHAR8_T_LOCK_FREE |
동작 방식
이 매크로들은 0, 1, 2 중 하나로 평가되는 전처리 상수 표현식이에요. 각 값은 대응하는 원자 타입(부호·무부호 모두)이 락 프리 성질을 얼마나 갖는지를 나타냅니다.
| 값 | 의미 |
|---|---|
| 0 | 그 원자 타입은 절대 락 프리가 아님 |
| 1 | 그 원자 타입은 때때로 락 프리임 |
| 2 | 그 원자 타입은 항상 락 프리임 |
값이 0이면 해당 원자 타입은 내부적으로 어떤 락을 사용한다는 뜻이에요. 반대로 2면 모든 연산이 락 없이 보장된다는 뜻이고요. 이 상수는 포팅 가능한 코드에서 '이 타입이 정말 락 프리인지 확인하고 로직을 다르게 가져갈지'를 정할 때 유용해요.
더 알아보기
<stdatomic.h>의 원자 타입과 함수들.atomic_flag: 항상 락 프리임이 보장되는 원자 부울 타입.