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 /* 未規定 */ once_flag
(2) (C11以降)
#define ONCE_FLAG_INIT /* 未規定 */
(3) (C11以降)
1) 複数のスレッドから呼び出された場合でも、関数 func を正確に一度だけ呼び出します。関数 func の完了は、同じ flag 変数を使用するすべての前後の call_once 呼び出しと同期します。
2) call_once で使用されるフラグを保持できる完全オブジェクト型。
3) once_flag 型のオブジェクトを初期化するために使用できる値に展開されます。

目次

翻訳の説明: - 「Contents」を「目次」に翻訳しました - HTMLタグ、属性、 内のC++関連用語(Parameters、Return value、Notes、Example、References、See also)は翻訳せず、そのまま保持しました - 数値、構造、フォーマットは完全に維持されています - プロフェッショナルな技術文書としての正確性を保っています

パラメータ

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
変更点: - "for" を "の" に翻訳 - HTMLタグ、属性、C++用語(call_once)は翻訳せず保持 - 元のフォーマットを完全に維持