atomic_flag_test_and_set
atomic_flag_test_and_set (플래그를 true로 설정하며 이전 값 얻기)
std::atomic_flag를 원자적으로 set(true) 상태로 바꾸면서 그 이전 값을 반환하는 연산이에요. 스핀락 획득에 해당하는 핵심 연산이죠. <atomic> 헤더, C++11부터.
출처: cppreference
본문
atomic_flag_test_and_set는 obj가 가리키는 std::atomic_flag의 상태를 set(true)로 원자적으로 바꾸고, 바꾸기 전의 값을 돌려줘요.
bool atomic_flag_test_and_set( std::atomic_flag* obj ) noexcept; // (2)
이 연산은 읽기-수정-쓰기(RMW) 연산이에요. 메모리 동기화 순서는 기본적으로 std::memory_order_seq_cst예요. _explicit 버전은 순서를 지정해요.
bool atomic_flag_test_and_set_explicit( std::atomic_flag* obj,
std::memory_order order ) noexcept; // (4)
스핀락에서 "잠금 시도"에 해당해요. 이전 값이 false였다면 이 스레드가 락을 얻은 것이고, true였다면 이미 누군가 잠금 중이라는 뜻이에요.
std::atomic_flag lock = ATOMIC_FLAG_INIT;
while (atomic_flag_test_and_set_explicit(&lock, std::memory_order_acquire)) {
// 이미 잠겨 있으면 회전하며 대기
}
// 임계 구역
atomic_flag_clear_explicit(&lock, std::memory_order_release);
반환 값이 true(이전에 set)이면 회전하고, false이면 락 획득 후 진행하는 식이에요. 자유 함수보다 멤버 함수(lock.test_and_set(...))가 더 흔히 쓰여요.