c++単例モード怠け者式、餓漢式を実現

2420 ワード

単一モードとは
このタイプの設計モードは、オブジェクトを作成するための最適な方法を提供する作成モードに属します.このモードは、独自のオブジェクトを作成し、単一のオブジェクトのみが作成されることを保証する単一のクラスに関連します.このクラスは、クラスのオブジェクトをインスタンス化する必要がなく、直接アクセスできる独自のオブジェクトにアクセスする方法を提供します.
怠け者:グローバルな単一インスタンスが最初に使用されたときに構築されることを指します.
#include 
#include 
#define barrier() __asm__ __volatile__("" ::: "memory")
using namespace std;


class Singleton
{
private:
    static Singleton* pInstance;
    Singleton()
    {
        pthread_mutex_init(&mutex, NULL);
    }
    Singleton(const Singleton&);
    Singleton& operator = (const Singleton&);
    
public:
    static Singleton* getInstance();
    static pthread_mutex_t mutex;
    void print()
    {
        cout << "this = " << this << endl;
    }
};


pthread_mutex_t Singleton::mutex;
Singleton* Singleton::pInstance = NULL;

Singleton* Singleton::getInstance()
{
    //double-check
    if(pInstance == NULL)
    {
        pthread_mutex_lock(&mutex);
        if(pInstance == NULL)
        {
           Singleton* temp = new Singleton;
           
           //         ,    ,   cpu          
           //          barrier      ,  pInstance    ,       
           // x86_64     barrier    #define barrier() __asm__ __volatile__("" ::: "memory")
           barrier();
           
           pInstance = temp;
        }
        pthread_mutex_unlock(&mutex);
    }
    
    return pInstance;
}

int main()
{
    Singleton* s1 = Singleton::getInstance();
    Singleton* s2 = Singleton::getInstance();
    
    s1->print();
    s2->print();
    
    return 0;
}

餓漢式:クラスのロード時にグローバルな単一のインスタンスが構築されることを意味します.
#include 
using namespace std;

class Singleton
{
private:
    static Singleton* pInstance;
    Singleton()
    {
        
    }
    Singleton(const Singleton&);
    Singleton& operator = (const Singleton&);
    
public:
    static Singleton* getInstance();
    void print()
    {
        cout << "this = " << this << endl;
    }
};

Singleton* Singleton::pInstance = new Singleton;

Singleton* Singleton::getInstance()
{
    return pInstance;
}

int main()
{
    Singleton* s1 = Singleton::getInstance();
    Singleton* s2 = Singleton::getInstance();
    
    s1->print();
    s2->print();
    
    return 0;
}