在多线程环境中,某些函数只能被调用一次,例如:初始化某个对象,而这个对象只能被初始化一次。
在线程的任务函数中,可以用std::call_once()来保证某个函数只被调用一次。
头文件:#include
template< class callable, class... Args >
void call_once( std::once_flag& flag, Function&& fx, Args&&... args );
第一个参数是std::once_flag,用于标记函数fx是否已经被执行过。
第二个参数是需要执行的函数fx。
后面的可变参数是传递给函数fx的参数。
#include <iostream>
#include <thread>
#include <chrono>
#include <mutex>
using namespace std;
once_flag onceflag; // once_flag全局变量,本质是取值为0和1的锁
//在线程中,打算只调用一次的函数
void call_once_func(int no, const string &str)
{
cout << "call_once_func:" << no << " " << str << endl;
}
void func(int no, const string &str)
{
call_once(onceflag, call_once_func, no, str);
for (int i = 0; i < 10; i++)
{
cout << no << str << endl;
this_thread::sleep_for(chrono::seconds(1));
}
}
int main()
{
thread t1(func, 1, "hello");
thread t2(func, 2, "world");
t1.join();
t2.join();
return 0;
}
/* 2world
1hello
1hello
2world
1hello
2world
2world
1hello
2world
1hello
1hello
2world
1hello
2world
1hello
2world
1hello
2world
1hello
2world */
在多线程编程中,std::call_once函数用于保证某个初始化函数在程序运行期间只被调用一次。once_flag标志配合call_once保证线程安全,防止多次初始化。示例代码展示了如何在多个线程中使用call_once初始化并调用函数call_once_func。
953

被折叠的 条评论
为什么被折叠?



