zoukankan      html  css  js  c++  java
  • 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
  • 相关阅读:
    模板-树链剖分
    bzoj2523 聪明的学生
    P1220 关路灯
    BZOJ3572 [Hnoi2014]世界树
    BZOJ4013 [HNOI2015]实验比较
    BZOJ4012 [HNOI2015]开店
    BZOJ4011 [HNOI2015]落忆枫音
    BZOJ4009 [HNOI2015]接水果
    BZOJ4010 [HNOI2015]菜肴制作
    BZOJ4008 [HNOI2015]亚瑟王
  • 原文地址:https://www.cnblogs.com/zwj-199306231519/p/13547884.html
Copyright © 2011-2022 走看看