C++ once_flag call_once使用
参考博客:https://zhuanlan.zhihu.com/p/71900518
1.在多线程中,有一种场景是某个任务只需要执行一次,可以用C++11中的std::call_once函数配合std::once_flag来实现。多个线程同时调用某个函数,std::call_once可以保证多个线程对该函数只调用一次。
#include<iostream>
#include<mutex>
#include<string>
#include<thread>
#include<memory>
#include<vector>
using namespace std;
once_flag flag;
void doOnce()
{
call_once(flag, [](){cout<<"hello"<<endl;});
}
int main()
{
vector<thread> vthread;
int n=4;
for(int i=0;i!=n;i++)
{
vthread.push_back(thread(doOnce));
}
for(int i=0;i!=n;i++)
{
vthread[i].join();
}
system("pause");
return 0;
}
2.实现线程安全的单例模式
SingleTask.h
#pragma once
#include <thread>
#include <iostream>
#include <mutex>
#include <memory>
class Task
{
private:
Task();
public:
static Task* task;
static Task* getInstance();
void fun();
};
//cpp文件
Task* Task::task;
Task::Task()
{
std::cout << "构造函数" << std::endl;
}
Task* Task::getInstance()
{
static std::once_flag flag;
std::call_once(flag, []
{
task = new Task();
});
return task;
}
void Task::fun()
{
std::cout << "hello world!"<< std::endl;
}
main.cpp
#include<iostream>
#include<mutex>
#include<string>
#include<thread>
#include<memory>
#include<vector>
#include"SingleTask.h"
using namespace std;
once_flag flag;
void doOnce()
{
call_once(flag, [](){cout<<"hello"<<endl;});
}
void test1()
{
vector<thread> vthread;
int n=4;
for(int i=0;i!=n;i++)
{
vthread.push_back(thread(doOnce));
}
for(int i=0;i!=n;i++)
{
vthread[i].join();
}
}
void test2()
{
vector<thread> vthread;
int n=4;
for(int i=0;i!=n;i++)
{
vthread.push_back(thread([](){Task* task=Task::getInstance();task->fun();}));
}
for(int i=0;i!=n;i++)
{
vthread[i].join();
}
}
int main()
{
test2();
system("pause");
return 0;
}