call_once是c++11中引入的新特性,用於保證某個函式只呼叫一次,即使是多執行緒環境下,它也可以可靠地完成一次函式呼叫。特別適用於某個初始化只執行一次的場景。
若呼叫call_once一切順利,將會翻轉once_flag變數的內部狀態,再次呼叫該函式時,所對應的目標函式不會被執行。
若呼叫call_once中發生異常,不會翻轉once_flag變數的內部狀態,再次呼叫該函式時,目標函式仍然嘗試執行。
下面**是在win7+vs2015編譯器測試通過,演示了如何使用c++11 中的call_once方法
#include "stdafx.h"
#include #include #include #include //單利模式應用
class csinglton
//在析構函式中釋放例項物件
~csinglton()
}public:
//(3)獲得本類例項的唯一全域性訪問點
static csinglton* getinstance()
catch (...)
}//例項已經存在,直接該例項物件
return pinstance;
}static void createinstance()
}private:
static csinglton* pinstance;//(2)唯一例項物件
static std::once_flag m_flag;
};csinglton* csinglton::pinstance = null;
//構造 once_flag 物件,內部狀態被設為指示函式仍未被呼叫。
std::once_flag csinglton::m_flag;
//輔助測試**
std::mutex g_mutex;
void printinstanceaddr()
int main()
for (int i = 0; i < 5; i++)
return 0;
}
執行結果:
0076e778
0076e778
0076e778
0076e778
0076e778
注意:上面的單例模式即直接按下面那樣不加鎖,不用std::call_once呼叫,在多執行緒中會因為執行緒競爭而導致不正確的結果出現。
//(3)獲得本類例項的唯一全域性訪問點
static csinglton* getinstance()
catch (...)
}//例項已經存在,直接該例項物件
return pinstance;
}
本文**:
參考資料:
C 介面使用方法
之前一直不理解介面這一概念,今天無意中翻書,網上查資料悟道其中的道理,現在工作沒有用到inte ce這一塊,怕以後會遇到忘記實現的方法便記錄下來,寫的不對希望讀者指出,話不多說,接下來看我對介面的理解。1.介面說明 介面為不同應用的實現提供了一中規範和約束,只要每個應用都遵守這種規範和約束,整個系統...
C 引用使用方法
引用是c 對c的擴充。在c c 中指標的作用基本都是一樣的,但c 增加了另外一種給函式傳遞位址的途徑,這就是引用傳遞,它也存在其他程式語言中 1.引用的實質是一段連續空間的別名 2.程式中通過變數來申請並命名記憶體空間 3.通過變數的名字可以使用記憶體空間 引用相當於給變數取別名 基本語法 type...
pythonpip使用方法 pip使用方法整理
匯出專案已安裝的pip包 pip list 檢視專案中安裝的包 pip freeze requirements.txt 將專案中所用到的第三方庫輸出到requirements.txt中 pip install 版本號 pip install i 本次使用清華源進行安裝 離線安裝第三方庫 一鍵安裝整個...