详细讲解一下std::call_once
时间: 2023-04-08 19:03:40 浏览: 140
C++11 std::shared_ptr总结与使用示例代码详解
std::call_once是C++11标准库中的一个函数,用于保证一个函数只被调用一次。它的原型如下:
template <class Callable, class... Args>
void call_once(std::once_flag& flag, Callable&& func, Args&&... args);
其中,flag是一个std::once_flag类型的对象,用于标记函数是否已经被调用过;func是一个可调用对象,可以是函数指针、函数对象或者Lambda表达式;args是func的参数列表。
当第一次调用std::call_once时,它会执行func(args...),并将flag标记为已调用。后续调用std::call_once时,如果flag已经被标记为已调用,则不会再次执行func(args...),而是直接返回。
std::call_once的一个常见用途是在多线程环境下保证某个函数只被调用一次。例如,可以使用std::call_once来初始化一个全局变量:
std::once_flag flag;
int global_var;
void init_global_var() {
global_var = compute_value();
}
void foo() {
std::call_once(flag, init_global_var);
// 使用global_var
}
在第一次调用foo时,std::call_once会执行init_global_var,计算出global_var的值并将flag标记为已调用。后续调用foo时,std::call_once会直接返回,不会再次执行init_global_var。这样就保证了global_var只被初始化一次。
总之,std::call_once是一个非常有用的函数,可以帮助我们在多线程环境下保证某个函数只被调用一次。
阅读全文