如何以及为什么使用call_once()?

问题描述 投票:0回答:1

来自N3220,§7.28.2.1“

call_once
函数”:

剧情简介

#include <threads.h>
void call_once(once_flag *flag, void (*func)(void));

描述

call_once
函数使用
once_flag
由标志指向,以确保
func
被准确调用 一次,第一次使用该值调用
call_once
函数
flag
。完成对
call_once
函数的有效调用 与
call_once
函数的所有后续调用同步 flag 的值相同。

退货

call_once
函数没有返回值。

听起来,这是否应该用于只应该被调用一次的

init()
/
config()
函数?或者我完全误解了它,它与线程有关?

这有什么用?

flag
是什么,它与这里有什么关系?

c c23
1个回答
3
投票

它保证了两件事:

  • 对于给定的参数对,所提供的函数将仅被
    call_once
    调用一次。[1]
  • call_once
    仅在调用所提供的函数后才会返回。

第二个保证意味着其他线程将阻塞,直到提供的函数返回(如果当前正在执行)。

这对于初始化/填充共享变量很有用。


  1. 这假设为具有给定标志对象的所有调用提供相同的函数,并且为具有给定函数的所有调用提供相同的标志对象。否则就没有意义。
© www.soinside.com 2019 - 2024. All rights reserved.