84 C++的call_once函数

在多线程环境中,某些函数只能被调用一次,例如:初始化某个对象,而这个对象只能被初始化一次。

在线程的任务函数中,可以用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 */

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值