シングルトン - 効果:
クラスのインスタンスを1つだけ確実に、そしてグローバルなアクセスポイントを提供します。
特長:
1.コンストラクタ民営化は、直接定義オブジェクトクラスがありません:プライベート:Csingle(){}。
2.クラス自体ポインタの静的メンバとしてのタイプを定義:静的CSingleton * m_singleInstanceと、
3.スタティックメンバ関数を定義するの種類としてクラス自体へのポインタを戻します。
静的CSingleton * getSingleInstance(){
もし(m_singleInstance == nullptr)m_singleInstance =新しいCSingleton。
m_singleInstanceを返します。
}
4.外部()関数は、この直接CSingleton :: getSingleInstanceの一意のインスタンスを取得します。
シングルトンとマルチスレッド
競争の防止:
1.マルチスレッドアクセス、必要同期メカニズム:同期のためgetSingleInstance関数を入力した後のようなミューテックスカーネルオブジェクトを追加します。
class CSingleton
{
public:
~CSingleton() {};
static CSingleton* m_sticSingleInstance;
static CSingleton* GetSingleInstance();
private:
CSingleton() {};
};
#include "CSingleton.h"
#include <boost/thread/mutex.hpp>
#include <boost/thread/lock_guard.hpp>
boost::mutex g_mutex;
CSingleton* CSingleton::m_sticSingleInstance = nullptr;
CSingleton* CSingleton::GetSingleInstance()
{
boost::lock_guard<boost::mutex> lock(g_mutex);//同步锁
if (m_sticSingleInstance == nullptr) {
m_sticSingleInstance = new CSingleton;
}
return m_sticSingleInstance;
}
m_singleInstanceインスタンス初期化、代わり次いでgetSingleInstance()関数の静的メンバは、オブジェクトのインスタンスを作成するとき2.良いm_singleInstanceインスタンスの事前分布、新しいCSingletonを達成します。
#include "CSingleton.h"
//初始化就创建实例,不会创建有多个实例
CSingleton* CSingleton::m_sticSingleInstance = new CSingleton;
CSingleton* CSingleton::GetSingleInstance()
{
return m_sticSingleInstance;
}
この方法は、初回のみが同期されます;、getSingleInstance機能では、すでに作成されていない場合は、インスタンスのみを同期させることが、作成されたかどうかを最初にチェックを揮発性の修正静的メンバーm_singleInstance「をダブルチェックロック」を使用して3.ダブルチェックロック、動作は、消費電力を低減する、getSingleInstance関数を使用して後続の同期操作は存在しないであろう。
#include "CSingleton.h"
#include <boost/thread/mutex.hpp>
#include <boost/thread/lock_guard.hpp>
boost::mutex g_mutex;
CSingleton* CSingleton::m_sticSingleInstance = nullptr;
CSingleton* CSingleton::GetSingleInstance()
{
if (m_sticSingleInstance == nullptr) {
//判断是否为nullptr后再加锁
boost::unique_lock<boost::mutex> lock(g_mutex);
if (m_sticSingleInstance == nullptr) {
m_sticSingleInstance = new CSingleton;
}
lock.unlock();
}
return m_sticSingleInstance;
}