atomic_flag_test_and_set

atomic_flag_test_and_set (플래그를 true로 설정하며 이전 값 얻기)

std::atomic_flag를 원자적으로 set(true) 상태로 바꾸면서 그 이전 값을 반환하는 연산이에요. 스핀락 획득에 해당하는 핵심 연산이죠. <atomic> 헤더, C++11부터.

출처: cppreference

본문

atomic_flag_test_and_setobj가 가리키는 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(...))가 더 흔히 쓰여요.

더 알아보기 (Learn more)

cppreference