首页技术文章正文

C++单例的完美实现【黑马C++培训】

更新时间:2023年01月03日 14时21分10秒 来源:黑马程序员论坛

黑马中级程序员课程

本帖最后由 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;

}

推荐了解热门学科

java培训 Python人工智能 Web前端培训 PHP培训
区块链培训 影视制作培训 C++培训 产品经理培训
UI设计培训 新媒体培训 产品经理培训 Linux运维
大数据培训 智能机器人软件开发




传智播客是一家致力于培养高素质软件开发人才的科技公司“黑马程序员”是传智播客旗下高端IT教育品牌。自“黑马程序员”成立以来,教学研发团队一直致力于打造精品课程资源,不断在产、学、研3个层面创新自己的执教理念与教学方针,并集中“黑马程序员”的优势力量,针对性地出版了计算机系列教材50多册,制作教学视频数+套,发表各类技术文章数百篇。

传智播客从未停止思考

传智播客副总裁毕向东在2019IT培训行业变革大会提到,“传智播客意识到企业的用人需求已经从初级程序员升级到中高级程序员,具备多领域、多行业项目经验的人才成为企业用人的首选。”

中级程序员和初级程序员的差别在哪里?
项目经验。毕向东表示,“中级程序员和初级程序员最大的差别在于中级程序员比初级程序员多了三四年的工作经验,从而多出了更多的项目经验。“为此,传智播客研究院引进曾在知名IT企业如阿里、IBM就职的高级技术专家,集中研发面向中高级程序员的课程,用以满足企业用人需求,尽快补全IT行业所需的人才缺口。

何为中高级程序员课程?

传智播客进行了定义。中高级程序员课程,是在当前主流的初级程序员课程的基础上,增加多领域多行业的含金量项目,从技术的广度和深度上进行拓展“我们希望用5年的时间,打造上百个高含金量的项目,覆盖主流的32个行业。”传智播客课程研发总监于洋表示。




黑马程序员热门视频教程

Python入门教程完整版(懂中文就能学会) 零起点打开Java世界的大门
C++| 匠心之作 从0到1入门学编程 PHP|零基础入门开发者编程核心技术
Web前端入门教程_Web前端html+css+JavaScript 软件测试入门到精通


分享到:
在线咨询 我要报名
和我们在线交谈!