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;
}
文章目录