在學習c++多執行緒的時候,其中有一節是在單例模式中實現資料共享,所以這裡先來看一下設計模式中的單例模式的實現
《設計模式 可復用面相物件軟體的基礎》中說道,singleton模式的意圖為:保證乙個類僅有乙個例項,並提供乙個訪問它的全域性訪問點。
優點:a)對唯一物件的受控訪問 因為類只包含乙個物件,所以它可以嚴格控制客戶怎樣以及何時訪問它
b)縮小名空間 singleton模式是對全域性變數的一種改進,避免了那些儲存唯一例項的全域性變數汙染名空間
c)允許對操作和表示的例項
d)允許可變數目的例項
e)比類操作更靈活
首先保證唯一的乙個類的例項,實現方法是:將建立這個例項的操作隱藏在乙個了類操作後面,有它來保證只有乙個例項被建立,這個操作可以訪問儲存唯一例項的變數,而且他可以保證這個變數在返回值之前用這個唯一例項初始化,這種方法保證了單件在他的首次是使用前被建立和使用
實現
#include #include #include #include #include using namespace std;
class mycas
return m_instance;
} class cgarhuishou //類套類,用來釋放物件
}};private:
mycas() {}; //私有化的建構函式,不能通過建構函式建立物件
private:
static mycas *m_instance;
};mycas *mycas::m_instance = null;
int main()
其中cgarhuishou是用來自動**建立的mycas物件的,使用的是rall機制
除了這種方式,我們還可以使用主動呼叫的方式,在mycas類中新增乙個函式 destoryinstance,這樣每次都要自己手動呼叫
mycas::destoryinstance();
static void destoryinstance()
}
這樣的實現,沒有考慮到多執行緒之間的物件傳輸問題, 所以要在這裡進行修改,如果我們在主線程中建立物件,這樣不會產生任何問題,但是如果將物件的初始化放在其他執行緒中,我們需要考慮一些其他的問題。
#include #include #include #include #include using namespace std;
std::mutex mymutex;
class mycas
} return m_instance;
} class cgarhuishou //類套類,用來釋放物件
}};private:
mycas() {}; //私有化的建構函式,不能通過建構函式建立物件
private:
static mycas *m_instance;
};mycas *mycas::m_instance = null;
void mythread()
once_flag(const once_flag&) = delete;
once_flag& operator=(const once_flag&) = delete;
void *_opaque;
};
所以我們這裡構造once_flag的物件就意味著,建立乙個空指標,用來作為call_once的第乙個引數。 call_once這個引數決定函式是否執行
第二個引數是呼叫的函式位址,第三引數以及後面的引數表示執行緒呼叫函式的引數
#include #include #include #include #include using namespace std;
std::mutex mymutex;
std::once_flag flag;
class mycas
static mycas *getinstance()
//}std::call_once(flag, createinstance); //只有乙個執行緒會呼叫這個函式,也是相當乙個互斥量了
return m_instance;
} class cgarhuishou //類套類,用來釋放物件
}};private:
mycas() {}; //私有化的建構函式,不能通過建構函式建立物件
private:
static mycas *m_instance;
};mycas *mycas::m_instance = null;
void mythread()
{ cout << "執行緒執行開始,指向得到執行緒為:" <《設計模式 可復用面相物件軟體的基礎》
設計模式 單例模式
單例模式 singleton pattern 是乙個比較簡單的模式,其定義如下 ensure a class has only one instance,and provide a golbal point of acess to it.確保某乙個類只有乙個例項,而且自行例項化並且向整個系統提供這個...
設計模式 單例模式
class testsingleton static public function instance return self testsingleton private function clone public function setsinvar sinvar public function ...
設計模式 單例模式
單例模式的目的是保證類在系統中只被例項化一次,由該唯一的例項來為系統提供服務.單例模式主要用於保證服務的統一,比如獲取統一的編號服務,模仿oracle的序列生成等.但單例的使用需要謹慎,特別是在需要作負載均衡的地方,因為這種程式級的單例模式實際上只能保證在乙個應用中為單例.如果被多個應用載入,還是會...