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
类型对象的值。
目录 |
参数
| 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
|