添加链接
link之家
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接
c++ 只执行一次的function

c++ 只执行一次的function

初始化等一些函数,往往只需要执行一次。现在我们梳理一下让function只执行一次的方法。

  1. 全局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)