atomic_flag
atomic_flag (무잠금 보장 원자 부울)
무잠금(lock-free)임이 보장되는 최소한의 원자 부울 타입이에요. 단순한 스핀락을 구현하는 가장 저수준의 도구예요. <atomic> 헤더, C++11부터.
출처: cppreference
본문
std::atomic_flag는 원자 부울 타입이에요. std::atomic의 모든 특수화와 달리, 무잠금임이 보장돼요. 반면 std::atomic<bool>과 달리 load/store 연산은 제공하지 않아요.
struct atomic_flag;
멤버 함수를 정리하면:
(constructor): atomic_flag를 생성해요.operator=[deleted]: 대입 연산자는 삭제돼 있어요.clear: 플래그를false로 원자적으로 설정해요.test_and_set: 플래그를true로 설정하면서 이전 값을 돌려줘요.test(C++20): 플래그 값을 원자적으로 반환해요.wait(C++20): 통지될 때까지 스레드를 블록하고 원자 값이 바뀌면 풀려요.notify_one/notify_all(C++20): 대기 중인 스레드를 깨워요.
전형적인 스핀락 구현이에요.
std::atomic_flag lock = ATOMIC_FLAG_INIT;
while (lock.test_and_set(std::memory_order_acquire)) {
// 이미 잠겨 있으면 회전하며 대기
}
// 임계 구역
lock.clear(std::memory_order_release);
test_and_set으로 잠금 시도(이전 값이 false면 획득 성공), clear로 해제를 표현해요. 아주 가벼운 동기화가 필요할 때 쓰고, 대부분의 응용에서는 std::atomic<bool>이나 뮤텍스가 더 편해요.