call_once, once_flag, ONCE_FLAG_INIT
From cppreference.net
|
ヘッダーで定義
<threads.h>
|
||
|
void
call_once
(
once_flag
*
flag,
void
(
*
func
)
(
void
)
)
;
|
(1) | (C11以降) |
|
typedef
/* 未規定 */
once_flag
|
(2) | (C11以降) |
|
#define ONCE_FLAG_INIT /* 未規定 */
|
(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++ documentation
for
call_once
|
|
C++ documentation
の
call_once
|