A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

本帖最后由 wuqiong 于 2018-7-6 09:35 编辑

这应该是懒汉模式完美单例了:


怎么控制创建类的过程

怎么兼容多线程

怎么在合适时机自动析构

怎么自动初始化mutex和释放

禁止拷贝,复制拷贝和等号运算符

// test.17.10.6.单例模式.cpp : 定义控制台应用程序的入口点。

//


#include "stdafx.h"

//#include <windows.h>

#include <pthread.h>



class CWMDL

{

private:

    CWMDL(){}

    static CWMDL* m_c ;//可以自动释放

    // 禁止拷贝--复制构造函数和等号运算符声明为私有的,并且不提供实现。  

    CWMDL(const CWMDL& other);  

    CWMDL& operator=(const CWMDL& other);  

public:

    static CWMDL* Create()

    {

        if (nullptr==m_c)

        {

            printf("似乎未创建\r\n");

            pthread_mutex_lock(&mutex);//双判断多线程加速

            if (nullptr==m_c)

            {

                printf("确定未创建\r\n");

                m_c = new CWMDL();

            }

            else

            {

                printf("其实创建了\r\n");

            }

             pthread_mutex_unlock(&mutex);


        }

        else

        {

            printf("已经创建\r\n");

        }

        return m_c;

    }


    class CGarbo // 它的唯一工作就是在析构函数中删除CSingleton的实例  

    {

    public:

        ~CGarbo()

        {  

            pthread_mutex_destory(&mutex);

            if (CWMDL::m_c)

                delete CWMDL::m_c;

        }

    };

    static CGarbo Garbo; // 定义一个静态成员,在程序结束时,系统会调用它的析构函数

    static pthread_mutex_t mutex;



};

CWMDL* CWMDL::m_c = nullptr;


pthread_mutex_t CWMDL::mutex = PTHREAD_MUTEX_INITIALIZER;//静态初始化




unsigned int __stdcall WorkThread(void*)

{

    CWMDL* p = CWMDL::Create();

    return 0;

}



int _tmain(int argc, _TCHAR* argv[])

{



    //CRITICAL_SECTION x = [](){CRITICAL_SECTION cs_tmp;InitializeCriticalSection(&cs_tmp);return cs_tmp;};


    /*

    因为是单类,只有一个类指针

    我认为 主动释放类的话(即调用delete),多线程 可能多次调用,所以我们要让它自动释放


    实验之。


    */

    const static int hdNumber = 20;

    HANDLE  hd[hdNumber] = {0};

    for (int i =0;i<hdNumber;++i)

    {

        _beginthreadex(NULL,0,WorkThread,0,NULL,0);


    }

    WaitForMultipleObjects(hdNumber,hd,TRUE,-1);


    Sleep(-1);




    return 0;

}

以下是饿汉实现,来自http://www.cnblogs.com/qiaoconglovelife/p/5851163.html


class singleton

{

protected:

    singleton()

    {}

private:

    static singleton* p;

public:

    static singleton* initance();

};

singleton* singleton::p = new singleton;

singleton* singleton::initance()

{

    return p;

}

5 个回复

倒序浏览
回复 使用道具 举报
回复 使用道具 举报
棒棒哒
回复 使用道具 举报
回复 使用道具 举报
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马