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
|