为了保证在多线程环境下,某个代码段仅仅被调用一次,比如,初始化某个对象,而这个对象只能初始化一次,就可以用std::call_once来保证代码段在多线程环境下只被调用一次。
使用std::call_once时候,需要一个once_flag作为call_once的参数:
#include <iostream> #include <thread> #include <vector> #include <string> #include <mutex> #include <map> using namespace std; std::once_flag falg; void do_once(){ std::cout << "Call Before!" << endl; std::call_once(falg,[](){std::cout << "Calling...!" << std::endl;}); std::cout << "Call After!" << endl; } int main(){ std::thread t1(do_once); std::thread t2(do_once); std::thread t3(do_once); t1.join(); t2.join(); t3.join(); return 0; }
注意:这里仅仅do_once函数中的一段代码,仅仅被调用一次,代码前后还是会被多次调用!