atomic_atomic_flag_test_and_set

atomic_atomic_flag_test_and_set (원자적 플래그 설정)

std::atomic_flag_test_and_setstd::atomic_flag를 설정(set) 상태로 만들어 이전 값을 반환해요. 스핀락 구현의 핵심 연산이에요.

출처: cppreference

본문

std::atomic_flag_test_and_setstd::atomic_flag_test_and_set_explicit<atomic> 헤더에 정의된 자유 함수예요.

bool atomic_flag_test_and_set( std::atomic_flag* flag ) noexcept;

bool atomic_flag_test_and_set_explicit( std::atomic_flag* flag,
                                        std::memory_order order ) noexcept;

flag가 가리키는 std::atomic_flag를 설정(set, true) 상태로 원자적으로 만들고 이전 값을 반환해요(원자적 read-modify-write). flag->test_and_set(order)처럼 동작해요.

반환값 (Return value)

연산 전의 플래그 값이에요 (true였으면 이미 설정됨).

예제 (Example)

#include <atomic>
#include <thread>

std::atomic_flag lock = ATOMIC_FLAG_INIT;
void spin_lock() { while (lock.test_and_set(std::memory_order_acquire)); }

int main()
{
    spin_lock();
    // 임계 구역
    lock.clear(std::memory_order_release);
}

더 알아보기 (Learn more)

cppreference