C 参考手册
- C 语言
- C 关键词
- 预处理器
- C 标准库头文件
- 类型支持
- 程序支持工具
- 变参数函数
- 错误处理
- 动态内存管理
- 日期和时间工具
- 字符串库
- 算法
- 数值
- 文件输入/输出
- 本地化支持
- 原子操作库
- 线程支持库
- thread_local
- thrd_create
- thrd_equal
- thrd_current
- thrd_sleep
- thrd_yield
- thrd_exit
- thrd_detach
- thrd_join
- thrd_success, thrd_timedout, thrd_busy, thrd_nomem, thrd_error
- mtx_init
- mtx_lock
- mtx_timedlock
- mtx_trylock
- call_once, once_flag, ONCE_FLAG_INIT
- mtx_unlock
- mtx_destroy
- mtx_plain, mtx_recursive, mtx_timed
- cnd_init
- cnd_signal
- cnd_broadcast
- cnd_wait
- cnd_timedwait
- cnd_destroy
- TSS_DTOR_ITERATIONS
- tss_create
- tss_get
- tss_set
- tss_delete
- 实验性 C 标准库
- 有用的资源
- 符号索引
- 注释
call_once, once_flag, ONCE_FLAG_INIT
定义于头文件 <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 | - | 指向用于确保只调用一次 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
引用
- C11 standard (ISO/IEC 9899:2011):
- 7.26.2.1 The call_once function (p: 378)
- 7.26.1/3 ONCE_FLAG_INIT (p: 376)