名稱空間
變體
操作

call_once, once_flag, ONCE_FLAG_INIT

來自 cppreference.com
< c‎ | thread
在標頭檔案 <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 - 指向 call_once 型別物件的指標,用於確保 func 只被呼叫一次
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++ 文件 for call_once