スレッドの安全なC++単例モード


自分が最近ずっと学校の募集時の知識を取り戻しているような気がします.しかし、今では多くの問題が学校の募集時よりも理解しやすく、運用を学ぶことができます.自分だけ急いで、せっかくのチャンスをつかめるようにしましょう.
今日、スレッドの安全なC++単例モードを書きます.1.単例モードとは、クラスを1つのオブジェクトのみインスタンス化することである.利点:1メモリを削減し、リソースの多重消費を削減します.2このクラスはオブジェクトをインスタンス化し、システムのオーバーヘッドを削減します.欠点:1インタフェースがなく、拡張が難しい.②単一職責の原則と衝突する.(クラスの定義は論理を定義し、いくつかのオブジェクトをインスタンス化することを気にしない)
2.コードは単例怠け者式単例モードを実現する(怠け者は、お腹が空いているときだけマントーを蒸す)
#include
using namespace std;

//            。
std::mutex singleMutex;

class Single()
{
public:
//GetInstance         ,                      virtual const  
	static Single* GetInstance()
	{
	//       ,      get      , if             
		singleMutex.lock();		
		if(Single::m_single == nullptr)
		{
			m_single = new Single();
		}
		singleMutex.unlock();		//  
		
		return m_single;	//        ,        get   ,   get          m_single。
	}
	
private:
	//        ,Effective C++    :
	//           ,        ,                         。
	//                                  。
	Single();
	Single(const Single& s);
	Single& operator=(const Single& s);

private:
	static Single* m_single;	//     ,static           
}
//    ,   getInstance        ,(    m_single    )
Single* Single::m_single = nullptr;



餓漢モード餓漢モードとは,オブジェクトがgetInstanceメソッドを呼び出す前にnewのクラスオブジェクトである.
#include
using namespace std;

class Single{
public:
	static Single* getInstance()
	{
	//          :                  ,         ,        。
		return sgl;
	}

private:
	Single() try{
		//          
	}catch(std::exception& e)
	{//    
		throw;
	}
	Single(const Single& s);
	Single& operator=(const Single& s);

private:
	static Single* sgl;
}

//           
Single* Single::sgl = new Single();