c++ 只执行一次的function
初始化等一些函数,往往只需要执行一次。现在我们梳理一下让function只执行一次的方法。
- 全局flag卫语句
非线程安全
bool flag = false;//全局
if(flag == false)
flag = true;
2.static flag 卫语句
非线程安全
static bool flag =false; //局部静态
if(flag ==false)
{ ...
flag =true;
3.static flag
非线程安全
static bool flag = (func(),true); //局部静态,逗号表达
如果function是有返回类型的,更可以:
static return_type flag = func();
//场景1:多次轮询
int main()
for(int i = 0;i<100;++i)
static return_type flag = func();
return 0;
4.std::once_flag
多线程,线程安全。
std::once_flag flag1;
void test_once()
std::cout<<"excute once"<<'\n';
void test()
std::call_once(flag1,std::bind(test_once));
//场景1:多线程
int main()
std::thread t1(test);
std::thread t2(test);
t1.join();
t2.join();
return 0;
//场景2:多次轮询
int main()
for(int i = 0;i<100;++i)
std::call_once(flag1,std::bind(test_once))
return 0;
5.c++ 闭包
函数与对其状态即 词法环境(lexical environment) 的引用共同构成 闭包(closure) 。也就是说,闭包可以让你从内部函数访问外部函数作用域。利用这一特性,我们可以实现只调用一次的方法。
void test_once()
std::cout<<"excute once"<<'\n';
auto once = [](auto f)
bool done = false;
return [=](auto &&...args)mutable{
if(!done)
done = true;
return f(args...);
//场景:多次轮询
int main()
auto f = once([](){ std::cout<<"excute once"<<'\n';});
auto f2= once(std::bind(test_once));
for(int i = 0;i<100;++i)