call_once、once_flag、ONCE_FLAG_INIT
来自 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 | - | 指向 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 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++ 文档 针对 call_once
|