Namespaces
Variants

call_once, once_flag, ONCE_FLAG_INIT

From cppreference.net
헤더 파일에 정의됨 <threads.h>
void call_once ( once_flag * flag, void ( * func ) ( void ) ) ;
(1) (C11부터)
typedef /* unspecified */ once_flag
(2) (C11부터)
#define ONCE_FLAG_INIT /* unspecified */
(3) (C11부터)
1) 여러 스레드에서 호출되더라도 함수 func 를 정확히 한 번만 호출합니다. 함수 func 의 완료는 동일한 flag 변수를 사용한 이전 또는 이후의 모든 call_once 호출과 동기화됩니다.
2) call_once 에서 사용되는 플래그를 보유할 수 있는 완전한 객체 타입.
3) once_flag 타입의 객체를 초기화하는 데 사용할 수 있는 값으로 확장됩니다.

목차

매개변수

flag - func 가 한 번만 호출되도록 보장하는 데 사용되는 call_once 타입 객체에 대한 포인터
func - 한 번만 실행할 함수

반환값

(없음)

참고 사항

이 함수의 POSIX에 상응하는 함수는 pthread_once 입니다.

예제

#include <stdio.h>
#include <threads.h>
void do_once(void) {
    puts("called once");
}
static once_flag flag = ONCE_FLAG_INIT;
int func(void* data)
{
    call_once(&flag, do_once);
}
int main(void)
{
    thrd_t t1, t2, t3, t4;
    thrd_create(&t1, func, NULL);
    thrd_create(&t2, func, NULL);
    thrd_create(&t3, func, NULL);
    thrd_create(&t4, func, NULL);
    thrd_join(t1, NULL);
    thrd_join(t2, NULL);
    thrd_join(t3, NULL);
    thrd_join(t4, NULL);
}

출력:

called once

참고문헌

  • C17 표준 (ISO/IEC 9899:2018):
  • 7.26.2.1 call_once 함수 (p: 275)
  • 7.26.1/3 ONCE_FLAG_INIT (p: 274)
  • C11 표준 (ISO/IEC 9899:2011):
  • 7.26.2.1 call_once 함수 (p: 378)
  • 7.26.1/3 ONCE_FLAG_INIT (p: 376)

참고 항목

C++ 문서 for call_once