a.對於支援c++11標準的編譯器
1.對於支援c++11標準的編譯器,可以直接借助c++11技術標準中「強制要求區域性靜態變數的初始化絕對執行緒安全」的要求,直接用區域性靜態變數來實現,實現無鎖方式來實現執行緒安全,如下。c++11對區域性靜態變數的初始化說明有單獨解釋,請查閱有關資料,此處不表。
class a
;public:
// 禁止拷貝構造,移動構造,賦值構造等 to do
static a* getinstance()
}
2.對於支援c++11標準的編譯器,借助std::call_once函式的特性,即確保該函式有且僅被呼叫一次,來實現單列,**如下
class a
}static a *ptr;
public:
// 禁止拷貝構造,移動構造,賦值構造等 to do
a * getinstance(););
return ptr;
}}a* a::ptr=null;
在組合語言層面,方法1與2其實本質一樣,看起來無鎖,但編譯器在轉化為彙編碼時,會在對應位置自動加原子鎖,類似借用原子操作實現無鎖線程安全
b.對於不支援c++11標準的老編譯器:
千萬不要借助雙重檢查加鎖模式(dclp)來實現單例的執行緒安全,因為dclp不能從源頭保證執行緒安全,因為**順線與最後機器碼執行順序因為編譯器優化而不一致,且涉及到多核處理器時,快取與主存之間資料交換的時序也是不確定的。因此,在老編譯器上,只有靠大顆粒度的加鎖方式,犧牲一定的效能,才能確保執行緒安全,**如下
class a
}static a *ptr;
mutex m_mutex;
public:
// 禁止拷貝構造,移動構造,賦值構造等 to do
a * getinstance()
// 解鎖
return ptr;
}}a* a::ptr=null;
鑑於目前c++11在國內使用幾乎全面普及化了,以後還是使用第一種方式設計單例,簡單高效粗暴。 關於單例設計模式的總結
1 什麼是單例設計模式 單例設計模式就是解決乙個類在記憶體中只有乙個物件。想要保證物件唯一 1 為了避免其他程式過多的建立該類物件,選控制其他程式建立該類物件 2 為了讓其他程式可以訪問到該類物件,只好在本類中自定義乙個物件 3 為了方便其他程式對自定義物件訪問,可以對外提供一些訪問方式 2 單例設...
C 單例設計模式
一.單例模式含義 通過單例模式,可以保證系統中乙個類只有乙個例項,而且該例項易於外界訪問,從而方便對例項個數的控制,並節約系統資源。二.採用單例模式的動機和原因 對於系統中的某個類來說,只有乙個例項很重要。例如 乙個系統中有多個列印任務,但是只能有乙個正在工作的任務。乙個系統只能有乙個視窗管理器或檔...
單例設計模式之總結
public class singleton private singleton public voidm public static void main string args 靜態 塊 class sinlgeton2 private sinlgeton2 public static sinlg...