once_flag — std::once_flag

once_flag — std::once_flag

std::once_flag 클래스는 std::call_once를 위한 보조 구조체예요. C++11에서 도입됐어요. <mutex> 헤더에 있어요.

여러 std::call_once 호출에 전달되는 std::once_flag 타입 객체 덕분에, 호출들이 서로 조율되어 정확히 하나의 호출만 실제로 완주하게 돼요.

출처: cppreference

본문

// <mutex> 헤더, C++11
class once_flag;

사용 예

#include <mutex>
#include <iostream>

std::once_flag flag;

void init() { std::cout << "init once\n"; }

void run() {
    std::call_once(flag, init);   // 여러 스레드가 불러도 init은 1번
}

int main() {
    std::thread t1(run), t2(run), t3(run);
    t1.join(); t2.join(); t3.join();   // "init once" 1번 출력
}

특징

  • once_flag복사·이동할 수 없어요 (call_once가 수정하기 때문).
  • call_once와 짝으로 쓰여요.
  • 전역/멤버로 두고 여러 스레드가 공유해요.
// 클래스 멤버로 사용
class Logger {
public:
    void log() {
        std::call_once(flag_, [] { /* 1회성 초기화 */ });
        // ...
    }
private:
    std::once_flag flag_;
};

std::once_flag는 단일·스레드 안전 초기화(싱글턴, 설정 로드)를 구현할 때 call_once와 함께 핵심적인 역할을 해요.

더 알아보기 (Learn more)

cppreference