首页 > 其他分享 >std::thread 六:多线程&单例类

std::thread 六:多线程&单例类

时间:2023-06-18 23:36:30浏览次数:51  
标签:std include MyCAS instance static 单例 多线程

 

为了避免单例类在多线程中重复的创建,下面提供了两种解决方法:

  1.互斥锁+双重检查

  2.std::call_once()

 

方法一:互斥锁+双重检查

#include <iostream>
#include <thread>
#include <mutex>
#include <list>
using namespace std;

std::mutex my_mutex;

// 创建一个单例类
class MyCAS
{
private:
    MyCAS() {}                    // 私有化构造函数
    static MyCAS* m_instance;    // 静态成员变量

public:
    static MyCAS* GetInstance()
    {
        // 2.双重检查
        if (m_instance == NULL)
        {
            // 1.互斥锁
            std::lock_guard<std::mutex> mylock(my_mutex);
            if (m_instance == NULL)
            {
                m_instance = new MyCAS();
                static CGarhuishou ci;
            }
        }
        return m_instance;
    }

    // 类中封装一个类,用来析构单例类
    class CGarhuishou
    {
    public:
        ~CGarhuishou()
        {
            if (MyCAS::m_instance)
            {
                delete MyCAS::m_instance;
                MyCAS::m_instance = NULL;
            }
        }
    };

    void func() { cout << "test 123" << endl; }
};


// 类静态变量初始化
MyCAS* MyCAS::m_instance = NULL;


// 线程入口函数
void myThread()
{
    cout << "线程开始执行" << endl;
    MyCAS* p = MyCAS::GetInstance();
    cout << "线程结束执行" << endl;
}

int main()
{
    // 创建对象,但会对象指针
    std::thread t1(myThread);
    std::thread t2(myThread);

    t1.join();
    t2.join();

    return 0;
}

 

 

方法二:std::call_once()

#include <iostream>
#include <thread>
#include <mutex>
#include <list>
using namespace std;

std::once_flag g_flag;

// 创建一个单例类
class MyCAS
{
    // 只被调用一次
    static void CreateInstance()
    {
        m_instance = new MyCAS();
        static CGarhuishou ci;
    }

private:
    MyCAS() {}                   // 私有化构造函数
    static MyCAS* m_instance;    // 静态成员变量

public:
    static MyCAS* GetInstance()
    {
        std::call_once(g_flag, CreateInstance);
        return m_instance;
    }

    // 类中封装一个类,用来析构单例类
    class CGarhuishou
    {
    public:
        ~CGarhuishou()
        {
            if (MyCAS::m_instance)
            {
                delete MyCAS::m_instance;
                MyCAS::m_instance = NULL;
            }
        }
    };

    void func() { cout << "test 123" << endl; }
};


// 类静态变量初始化
MyCAS* MyCAS::m_instance = NULL;


// 线程入口函数
void myThread()
{
    cout << "线程开始执行" << endl;
    MyCAS* p = MyCAS::GetInstance();
    cout << "线程结束执行" << endl;
}

int main()
{
    // 创建对象,但会对象指针
    std::thread t1(myThread);
    std::thread t2(myThread);

    t1.join();
    t2.join();

    return 0;
}

 

标签:std,include,MyCAS,instance,static,单例,多线程
From: https://www.cnblogs.com/shiyixirui/p/17490002.html

相关文章

  • std::thread 三:条件变量(condition_variable())
     condition_variable 、  wait  、  notify_one  、  notify_all *:notify_one:通知(唤醒)一个线程*:notify_all:通知(唤醒)多个线程 #include<iostream>#include<thread>#include<mutex>#include<list>usingnamespacestd;classA{public:......
  • std::thread 四:异步(async)
     *:如果std::async中传递参数std::lunnch::deferred,就需要等待调用get()或者wait()才会执行,并且代码非子线程运行,而是在主线程中执行 #include<iostream>#include<thread>#include<mutex>#include<list>#include<future>usingnamespacestd;intmyThre......
  • std::thread 五:打包任务(packaged_task)
     #include<iostream>#include<thread>#include<mutex>#include<list>#include<future>usingnamespacestd;intmyThread(intnum){cout<<"myThread()startthreadid="<<this_thread::get_i......
  • std::thread 一:创建线程的三种方式
    前言:#include<thread>thread.join()//阻塞thread.detach()//非阻塞thread.joinable()//bool,判断线程是否支持join或者detach 正文:创建线程有三种方式,分别是:使用函数来创建线程、使用自定义的类来创建线程、使用lambda函数来创建线程 一、使用函数来......
  • std::thread 二:互斥量(lock() & unlock())
     mutex 互斥量的作用是保护共享数据*:有lock() 就一定要有 unlock()#include<iostream>#include<thread>#include<mutex>#include<list>usingnamespacestd;classA{public:voidinNum(){for(inti=0;i<10000;i++)......
  • std::thread 二:互斥量(lock_guard())
    *:使用lock_guard后,就不可以使用lock()和unlock()*:lock_guard和智能指针一样,会自动解锁 #include<iostream>#include<thread>#include<mutex>#include<list>usingnamespacestd;classA{public:voidinNum(){for(inti=0;......
  • std::thread 二:互斥量(多个互斥量的解决方法)
     //*:这里的lock是函数模板,最少传两个互斥量//第一种,使用lock和unlockstd::mutexm_mutex1;std::mutexm_mutex2;std::lock(m_mutex1,m_mutex2);m_mutex1.unlock();m_mutex2.unlock();//第二种,使用lock和lock_guardstd::mutexm_mutex1;std::mutexm_m......
  • std::thread 二:互斥量(带超时的互斥量 timed_mutex())
     timed_mutex、 try_lock_for、 try_lock_until #include<iostream>#include<thread>#include<mutex>#include<list>usingnamespacestd;classA{public:voidinNum(){for(inti=0;i<10000;i++)......
  • std::string 拼接字符串
      #include<iostream>#include<string>#include<sstream>usingnamespacestd;intmain(){stringa="123";stringstreamb;b<<123<<"456"<<789<<"-=-=";......
  • 单例模式-07
    概述单例模式(SingletonPattern)又称单件模式、单态模式。确保一个类只能有一个实例,同时保证该类的实例只能在类内部创建,提供给整个系统使用。优点:节约系统资源,提高系统性能。缺点:扩展困难,一定程度上违反了“单一职责原则”。classSingleton{privatestaticSingleton......