call_once, once_flag, ONCE_FLAG_INIT
From cppreference.com
| ヘッダ <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 The call_once function (p: 275)
- 7.26.1/3 ONCE_FLAG_INIT (p: 274)
- C11標準 (ISO/IEC 9899:2011)
- 7.26.2.1 The call_once function (p: 378)
- 7.26.1/3 ONCE_FLAG_INIT (p: 376)
[編集] 関連項目
| C++ ドキュメント ( call_once について)
|