<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
在我們日常開發中,無可避免需要使用單例模式進行設計類物件,那麼實際上我們寫單例格式基本都是一樣的,那麼每次都要寫幾乎一模一樣的程式碼來實現我們需要的單例物件是不是會覺得很累?下面博主提供一種單例模板來完成我們日常設計單例類,提高工作效率。既然封裝了,那麼當然是封裝一個執行緒安全的單例模板,如下:
#pragma once #include <stdlib.h> #include <assert.h> #include <thread> #include <mutex> /******************************************************************************/ /**********************ufgnix0802:單例宏定義(執行緒安全)*************************/ /******************************************************************************/ #define SINGLETON_CLASS_DEFAULT(Class) private: Class() {} ~Class() {} Class(Class &other) {} Class(const Class &other) {} Class& operator=(Class &other) {} Class& operator=(const Class &other) {} #define SINGLETON_CLASS_FUNC_DECL(Class) public: static Class& Ins(); private: static void InitSingleton(); static void Release(); SINGLETON_CLASS_DEFAULT(Class) private: static std::once_flag m_singletonFlag; static Class* m_ins; /* https://liam.page/2020/10/27/implement-a-singleton-class-template-in-cxx/ */ /* https://liam.page/2017/01/17/layers-and-operation-system/#CPU-%E5%8A%A8%E6%80%81%E8%B0%83%E5%BA%A6 */ #define SINGLETON_CLASS_FUNC_IMPL(Class) Class& Class::Ins() { /* 使用雙重檢查,外層檢查是為了避免鎖住過大的面積,從而導致鎖的競爭特別頻繁;*/ /* 內層檢查是為了確保只在其它執行緒沒有搶佔鎖完成初始化工作而設計。*/ /* 這種做法在Java下是正確的,但是在C++下則沒有保證。*/ /* std::once_flag 和 std::call_once:它們內部利用互斥量和條件變數組合,*/ /* 實現這樣的語意。值得一提的是,如果執行過程中丟擲異常,標準庫的設施不認為 */ /* 這是一次「成功的執行」。於是其他執行緒可以繼續搶佔鎖來執行函數。 */ /* std:call_once確保函數或程式碼片段在多執行緒環境下,只需要執行一次。 */ std::call_once(m_singletonFlag, &Class::InitSingleton); assert(m_ins != NULL); return *m_ins; } void Class::InitSingleton() { m_ins = new Class; if (m_ins) { /* C 庫函數 int atexit(void (*func)(void)) 當程式正常終止時,呼叫指定的*/ /* 函數func。您可以在任何地方註冊你的終止函數,*/ /* 但它會在程式終止的時候被呼叫。*/ ::atexit(Release); } } void Class::Release() { if (m_ins) { delete m_ins; m_ins = NULL; } } #define SINGLETON_CLASS_VARIABLE_IMPL(Class) std::once_flag Class::m_singletonFlag; Class* Class::m_ins = NULL; #define SINGLETON_CLASS_IMPL(Class) SINGLETON_CLASS_VARIABLE_IMPL(Class) SINGLETON_CLASS_FUNC_IMPL(Class)
注意,如果我們的單例類物件在.hpp檔案中那麼可能出現重定義的問題,博主設計的單例模板,只適用於.h和.cpp,即宣告和定義分開單例類物件。
#include "ISingleton.hpp" class Aclass { //宣告 SINGLETON_CLASS_FUNC_DECL(Aclass) public: int a; };
#include "Aclass.h" //定義 SINGLETON_CLASS_IMPL(Aclass);
#include "Aclass.h" int main() { //Aclass a; err Aclass::Ins().a = 5; std::cout << Aclass::Ins().a << std::endl; return 0; }
執行結果:
到此這篇關於C++使用宏函數實現單例模板詳解的文章就介紹到這了,更多相關C++宏函數實現單例模板內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45