我寫了一個(gè)單例類,使用了雙重檢查鎖定的方法,確保只有一個(gè)類實(shí)例生成。其中我使用mutex,從而實(shí)現(xiàn)鎖定方法。(單純的替換mutex->spinlock好像會(huì)報(bào)編譯錯(cuò)誤。另外,順便問下,把mutex換成spinlock在Singleton模式下會(huì)有比較大的性能提升么?(目測(cè)不會(huì)。。。= =。。我的代碼如下:#ifndef SINGLETON#define SINGLETONclass CSingleton{public: static CSingleton* getInstance()
{ if(!uniqueInstance)
{ pthread_mutex_lock(&mutex); if(!uniqueInstance)
{
uniqueInstance = new CSingleton();
} pthread_mutex_unlock(&mutex);
} return uniqueInstance;
} void fill(int x){ val += x; } int getVal(){ return val; }private: int val; CSingleton()
{
val = 0;
} CSingleton(const CSingleton&){}
CSingleton & operator = (const CSingleton&); static CSingleton * uniqueInstance; static pthread_mutex_t mutex;
};
CSingleton * CSingleton::uniqueInstance = NULL;pthread_mutex_t CSingleton::mutex = PTHREAD_MUTEX_INITIALIZER;#endif
1 回答

明月笑刀無(wú)情
TA貢獻(xiàn)1828條經(jīng)驗(yàn) 獲得超4個(gè)贊
新的 C++11 標(biāo)準(zhǔn)增加了 2 種單例的寫法
1 static 變量是線程安全的
T& getInstance () { static T instance; return instance; }
2 使用 std::call_once,他保證了函數(shù)只會(huì)調(diào)用一次
std::once_flag flag; T* instance; T* getInstance () { std::call_once(flag, [instance]() { instance = new T; }); return instance; }
- 1 回答
- 0 關(guān)注
- 511 瀏覽
添加回答
舉報(bào)
0/150
提交
取消