名前空間
変種
操作

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 について)
English 日本語 中文(简体) 中文(繁體)