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와 함께 핵심적인 역할을 해요.