call_once, once_flag, ONCE_FLAG_INIT
來自 cppreference.com
在標頭檔案 <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
|