std::call_once实现

Std::call_once 多线程库中只被调用一次函数实现方法 保证f只被调用一次 fox 库可由github.com/jiayuehua/fox中查看

#include <iostream>
#include <utility>
#include <fox/thread.hpp>
#include <mutex>
struct OnceFlag {
  std::mutex m_;
  bool hascalled_ = false;
};
template< class Callable, class... Args >
void callOnce(OnceFlag& flag, Callable&& f, Args&&... args)
{
  std::scoped_lock l(flag.m_);
  if (!flag.hascalled_)
  {
    std::forward<Callable>(f)(std::forward<Args>(args)...);
    flag.hascalled_ = true;
  }
}
//例子 
OnceFlag onceflag;
void OnlyOnce()
{
  std::cout << "OnlyOnce!\n";
}
  
void ThreadFoo()
{
  callOnce(onceflag, OnlyOnce);
}
  
int main()
{
  fox::Thread t(ThreadFoo);
  fox::Thread t1(ThreadFoo);
  fox::Thread t2(ThreadFoo);
  fox::Thread t3(ThreadFoo);
}

输出 OnlyOnce!

Posted 2018-06-15