락 프리 여부 매크로: 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: 항상 락 프리임이 보장되는 원자 부울 타입.