C++多线程中单例模式注意的问题

1.释放单例模式中的对象问题

2.单例模式中多线程时数据共享问题

#include <iostream>
#include<thread>
#include<string>
#include<vector>
#include<algorithm>
#include<windows.h>
#include<list>
#include<mutex>

using namespace std;

static std::mutex mut;

class MyClass
{
public:
    static MyClass *GetInstance()
    {
        if (m_instance == NULL)   //双重锁定
        {
            std::unique_lock<std::mutex> myMutex(mut);
            if (m_instance == NULL)   
            {
                m_instance = new MyClass();
                static GCMyClass gc;
            }
        }
        
        return m_instance;
    }
    
    class GCMyClass       //类中嵌套类,用来释放对象
    {
    public:
        ~GCMyClass()
        {
            if (MyClass::m_instance != NULL)
            {
                delete MyClass::m_instance;
                MyClass::m_instance = NULL;
            }
        }
    private:

    };

private:
    static MyClass *m_instance;
};

MyClass *MyClass::m_instance = NULL;

int main()
{
    MyClass *pMyClass = MyClass::GetInstance();

    
    system("pause");
}

解释:

  1.为了释放单例模式中的对象(m_instance),巧妙的使用了类中嵌套类的方式来释放。

  2.多线程中使用单例模式的话,对m_instance不加锁的话,可能会出现多次对m_instance进行new()开辟空间,所以必须加锁。锁外部使用if (m_instance == NULL)的作用是为了提高程序的效率,因为如果不加这句,代码中每次调用GetInstance()这个方法都会加锁,但其实只是MyClass类第一次实例化的时候需要加锁,后面的话就不需要加锁。

111
原文地址:https://www.cnblogs.com/zwj-199306231519/p/13547884.html