命名空间
变体
操作

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 /* 未指定 */ 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