C++单例模式

10 篇文章 0 订阅
//
// Created by fengxb on 18-7-28.
//

#ifndef SINGLETON_SINGLETON_H
#define SINGLETON_SINGLETON_H

#include <pthread.h>

class Singleton{
public:
    static Singleton* getInstance();
    static void destroy();
private:
    Singleton();
    ~Singleton();

private:
    static pthread_mutex_t mutex;
    static Singleton* singleton_ptr;
};

#endif //SINGLETON_SINGLETON_H
//
// Created by fengxb on 18-7-28.
//
#include <iostream>
#include "Singleton.h"

Singleton* Singleton::singleton_ptr= nullptr;
pthread_mutex_t Singleton::mutex;

Singleton* Singleton::getInstance()  {
    if(singleton_ptr== nullptr){
        pthread_mutex_init(&mutex, nullptr);
        pthread_mutex_lock(&mutex);
        if(singleton_ptr== nullptr){
            singleton_ptr=new Singleton();
        }
        pthread_mutex_unlock(&mutex);
        pthread_mutex_destroy(&mutex);
    }
    return singleton_ptr;
}

Singleton::Singleton() {
    std::cout<<"constructor"<<std::endl;
}

Singleton::~Singleton() {
    std::cout<<"destructor"<<std::endl;
    singleton_ptr= nullptr;
}

void Singleton::destroy() {
    if(singleton_ptr){
        pthread_mutex_init(&mutex, nullptr);
        pthread_mutex_lock(&mutex);
        if(singleton_ptr){
            delete singleton_ptr;
            singleton_ptr= nullptr;
        }
        pthread_mutex_unlock(&mutex);
        pthread_mutex_destroy(&mutex);
    }
}
#include <iostream>
#include "Singleton.cpp"
int main() {
    Singleton *a=Singleton::getInstance();
    Singleton *b=Singleton::getInstance();
    if(a==b) {
        std::cout<<"a==b"<<std::endl;
    }
    Singleton *c=Singleton::getInstance();
    std::cout<<a<<std::endl;
    std::cout<<b<<std::endl;
    std::cout<<c<<std::endl;
    a->destroy();
//    b->destroy();
    a= nullptr;
    std::cout<<a<<std::endl;
    std::cout<<b<<std::endl;
    std::cout<<c<<std::endl;
    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值