C++-饿汉式声明(单例声明)和懒汉式声明(单例声明 线程thread)

饿汉式声明, 一开始的时候对单例进行声明

#include <iostream>

using namespace std; 

class Singleton{ 
public:
    static Singleton& getInstance(void){
        return s_instance;
    }
    void print(void) {
        cout<<m_data<<endl;
    }

private:
    Singleton(int data = 0):m_data(data){
        cout << "单例被创建" << endl;     
    }; 
    Singleton(const Singleton&); 
    int m_data; 
    static Singleton s_instance; 
}; 

Singleton Singleton::s_instance = 123; 

int main(void){
    Singleton& s1 = Singleton::getInstance(); 
    Singleton& s2 = Singleton::getInstance(); 
    Singleton& s3 = Singleton::getInstance(); 

    cout << &s1 << endl; 
    cout << &s2 << endl; 
    cout << &s3 << endl; 
    return 0; 
}

懒汉式声明, 在进行调用的时候进行声明,这里使用了线程里的互斥锁

#include <iostream>

using namespace std; 


class Singleton{
public:
    static Singleton& getInstance(void){
        pthread_mutex_lock(&mutex);
        if(s_instance == NULL){
            s_instance = new Singleton(123);          
        }
        ++s_count; 
        pthread_mutex_unlock(&mutex); 
        return *s_instance;
    }
    //所有的使用者都不用再销毁 
    void release(void) {
        pthread_mutex_lock(&mutex); 
        if (--s_count == 0){
            delete s_instance;
            s_instance = NULL; 
        }  
        pthread_mutex_unlock(&mutex); 
    }
    //单列对象不用销毁 
    void print(void) {
        cout << m_data << endl; 
    }
private:
    Singleton(int data=0):m_data(data){
        cout << "创建单例" << endl; 
    } 
    Singleton(const Singleton&); 
    ~Singleton(void){
        cout << "单例被删除" << endl; 
    }
    int m_data; 
    static Singleton* s_instance; 
    static int s_count; 
    static pthread_mutex_t mutex;  
};     

Singleton* Singleton::s_instance = NULL;//进行私有化的生成操作 
int Singleton::s_count = 0;
//互斥锁定义和初始化  
pthread_mutex_t Singleton::mutex = PTHREAD_MUTEX_INITIALIZER; 

int main() {
    Singleton& s1 = Singleton::getInstance(); 
    Singleton& s2 = Singleton::getInstance(); 
    Singleton& s3 = Singleton::getInstance(); 

    cout << "&s1" << &s1 << endl; 
    cout << "&s2" << &s2 << endl; 
    cout << "&s3" << &s3 << endl; 

    s1.print(); 
    s1.release(); 

    s2.print(); 
    s2.release(); 

    s3.print(); 
    s3.release(); 

}

 

原文链接: https://www.cnblogs.com/hyq-lst/p/12866269.html

欢迎关注

微信关注下方公众号,第一时间获取干货硬货;公众号内回复【pdf】免费获取数百本计算机经典书籍;

也有高质量的技术群,里面有嵌入式、搜广推等BAT大佬

    C++-饿汉式声明(单例声明)和懒汉式声明(单例声明 线程thread)

原创文章受到原创版权保护。转载请注明出处:https://www.ccppcoding.com/archives/347567

非原创文章文中已经注明原地址,如有侵权,联系删除

关注公众号【高性能架构探索】,第一时间获取最新文章

转载文章受原作者版权保护。转载请注明原作者出处!

(0)
上一篇 2023年3月2日 上午4:34
下一篇 2023年3月2日 上午4:35

相关推荐