Creational.SingletonPattern单例模式:垃圾回收+线程安全

版权声明:本文为博主原创文章,允许转载,转载请注明出处。 https://blog.csdn.net/KnightOnHourse/article/details/79959609

//保证一个类仅有一个实例,同时提供能对该实例加以访问的全局访问方法。


//******************************************************************
class CSingle{
public:
    //提供全局访问的访问点
    static CSingle* GetInst();
private:
    CSingle();//将构造函数设为私有属性
    static CSingle* pInst;
    //内部类,用于垃圾回收
    class CDestroy{//全局静态变量,会被自动销毁,从而实现对单例的垃圾回收
    public:
        ~CDestroy();
    };
    static CDestroy oDestroy;
    
    class CLock{
    private:
        HANDLE hMutex;
    public:
        CLock();
        ~CLock();
        void Lock();
        void Unlock();
    };
    static CLock oLock;

};



CSingle::CLock::CLock(){ hMutex = CreateMutex(NULL, FALSE, NULL); }
CSingle::CLock::~CLock() { CloseHandle(hMutex);}
void CSingle::CLock::Lock(){ WaitForSingleObject(hMutex, INFINITE);}
void CSingle::CLock::Unlock(){ ReleaseMutex(hMutex);}
    //******************************************************************
//提供全局访问的访问点
CSingle* CSingle::GetInst(){
    //static CSingleton instance;return &instance;
    if(NULL == pInst){
        pInst = new CSingle(); printf("new pInst;\n");
    }
    return pInst;
}

CSingle::CSingle(){}//将构造函数设为私有属性
CSingle* CSingle::pInst = NULL;
//内部类,用于垃圾回收
CSingle::CDestroy::~CDestroy(){
    if(pInst != NULL){//在这里销毁资源,比如数据库连接,句柄等。
        oLock.Lock();
        if(pInst != NULL){
            delete pInst; pInst = NULL; printf("delete pInst;\n");
        }
        oLock.Unlock();
    }
}
CSingle::CDestroy CSingle::oDestroy;
CSingle::CLock CSingle::oLock;


//客户端测试

void main()
{
    CSingle* pInst1 = CSingle::GetInst();
    CSingle* pInst2 = CSingle::GetInst();

    printf("pInst1 = %p, pInst2 = %p. ", pInst1, pInst2);

}





阅读更多
想对作者说点什么?

博主推荐

换一批

没有更多推荐了,返回首页