C++-饿汉式声明(单例声明)和懒汉式声明(单例声明 线程thread)
饿汉式声明, 一开始的时候对单例进行声明
#include <iostream> using namespace std; class Singleton{ public: static Singleton& getInstance(void){ return s_instance; } void print(void) { cout<<m_data<<endl; } private: Singleton(int data = 0):m_data(data){ cout << "单例被创建" << endl; }; Singleton(const Singleton&); int m_data; static Singleton s_instance; }; Singleton Singleton::s_instance = 123; int main(void){ Singleton& s1 = Singleton::getInstance(); Singleton& s2 = Singleton::getInstance(); Singleton& s3 = Singleton::getInstance(); cout << &s1 << endl; cout << &s2 << endl; cout << &s3 << endl; return 0; }
懒汉式声明, 在进行调用的时候进行声明,这里使用了线程里的互斥锁
#include <iostream> using namespace std; class Singleton{ public: static Singleton& getInstance(void){ pthread_mutex_lock(&mutex); if(s_instance == NULL){ s_instance = new Singleton(123); } ++s_count; pthread_mutex_unlock(&mutex); return *s_instance; } //所有的使用者都不用再销毁 void release(void) { pthread_mutex_lock(&mutex); if (--s_count == 0){ delete s_instance; s_instance = NULL; } pthread_mutex_unlock(&mutex); } //单列对象不用销毁 void print(void) { cout << m_data << endl; } private: Singleton(int data=0):m_data(data){ cout << "创建单例" << endl; } Singleton(const Singleton&); ~Singleton(void){ cout << "单例被删除" << endl; } int m_data; static Singleton* s_instance; static int s_count; static pthread_mutex_t mutex; }; Singleton* Singleton::s_instance = NULL;//进行私有化的生成操作 int Singleton::s_count = 0; //互斥锁定义和初始化 pthread_mutex_t Singleton::mutex = PTHREAD_MUTEX_INITIALIZER; int main() { Singleton& s1 = Singleton::getInstance(); Singleton& s2 = Singleton::getInstance(); Singleton& s3 = Singleton::getInstance(); cout << "&s1" << &s1 << endl; cout << "&s2" << &s2 << endl; cout << "&s3" << &s3 << endl; s1.print(); s1.release(); s2.print(); s2.release(); s3.print(); s3.release(); }
每天更新pyQt5内容
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?