如果要保证某个函数在多线程的环境下只被调用一次,可以使用callonce,一个典型的场景就是初始化。callonce需要once_flag作为入参。使用时需要包含头文件<mutex>
#include<iostream>
#include<thread>
#include<mutex>
std::once_flag flag;
std::once_flag flag2;
void f() {
std::cout << "call once" << std::endl;
}
void do_once() {
std::call_once(flag, f);
std::call_once(flag2, f);
}
int main() {
//error std::call_once不可作为参数
//std::thread t1(std::call_once(flag, []{std::cout << "call once" << std::endl;}));
std::thread t1(do_once);
std::thread t2(do_once);
t1.join();
t2.join();
}
其输出为
call once
call once