单例 C++ 懒汉+恶汉

news/2024/11/1 14:01:56/

单例设计模式是一种创建型设计模式,确保一个类只有一个实例,减少了内存的开销,并提供一个全局访问点访问该实例。 私有化构造函数、拷贝构造函数、赋值函数 ,定义一个类的私有静态对象成员,定义一个公共的访问该实例静态对象成员的方法,返回该静态对象成员 ,单例设计模式 有懒汉式:获取该类的对象时才创建该类的实例(局部静态变量解决线程不安全),还有饿汉式:获取前就已经创建好。单例模式一般没有接口,扩展困难。

#include <iostream>
#include <vector>
#include <thread>
#include <queue>
#include <functional>
#include <mutex>
#include <condition_variable>
#include <chrono>
class ThreadPool {
private:std::vector<std::thread> threads;std::queue<std::function<void()>> tasks;std::mutex mutex;std::condition_variable condition;bool stop;ThreadPool() : stop(false) {int numThreads = std::thread::hardware_concurrency(); //来获取当前系统支持的并发线程数量,在多线程编程中,可以使用这个值来确定最佳的线程数量以提高程序的性能。for (int i = 0; i < numThreads; ++i) {threads.emplace_back([this] {while (true) {std::unique_lock<std::mutex> lock(mutex);condition.wait(lock, [this] { return stop || !tasks.empty(); });if (stop && tasks.empty()) {return; }std::function<void()> task=std::move(tasks.front());tasks.pop();lock.unlock();//确保只有一个线程共享资源,这个资源以及取出来了,就可以解锁让其他线程去访问了task();}           });      } }ThreadPool(const ThreadPool& theadpool) = delete;
ThreadPool& operator=(const ThreadPool& theadpoll) = delete;
/*MprpcApplication(const MprpcApplication&) = delete;
MprpcApplication(MprpcApplication&&) = delete;
还有这种写法*/
//析构函数是私有的时候,只有类的成员函数才能调用析构函数public: 
~ThreadPool() {{std::unique_lock<std::mutex> lock(mutex);stop = true;}condition.notify_all();for (auto& thread : threads) {thread.join();}  }static ThreadPool& getInstance() {使用引用避免拷贝构造//懒汉模式需要解决线程不安全//使用C++11的call_once实现线程安全,避免多个线程进来的时候同时new
//多线程运行的结果的单线程运行的结果一样,但是call_once只能在多线程里面使用,在main()里面调用会报错,像主函数thread t1什么的那样的可以//也使用两个 if 判断语句的技术称为双检锁;好处是,只有判断指针为空的时候才加锁//最好的是使用局部静态变量来解决static ThreadPool instance; 在 C++11 中,静态局部变量这种方式天然是线程安全的
这里不能定义为引用,引用是引用已经存在的对象return instance;/*
;饿汉模式,线程安全, */ }// 向任务队列中添加任务template<typename F, typename... Args>//任意数量,类型的参数void enqueue(F&& f, Args&&... args) {可变参数模板// 将各种类型的任务包装为std::function,然后加入任务队列,std::function<void()> task=std::bind(std::forward<F>(f), std::forward<Args>(args)...);{std::unique_lock<std::mutex> lock(mutex);tasks.emplace(std::move(task));}condition.notify_one(); // 通知一个等待的线程去执行任务}};
int main() {// ThreadPool::getInstance(); // 获取线程池实例for (int i = 0; i < 8; ++i) {ThreadPool::getInstance().enqueue([i] {
std::cout << "Task " << i << " is running in thread  " << std::this_thread::get_id() << std::endl;std::this_thread::sleep_for(std::chrono::seconds(5));std::cout << "Task " << i << " is done " << std::endl;}); }  
return 0;}
饿汉:
class Singleton{public:static Singleton* GetInstance() //通过调用GetInstance() 在类外获得实例{	return &_slt;                //返回这个实例的地址} private:static Singleton _slt; //类内声明


http://www.ppmy.cn/news/1543598.html

相关文章

一文解析——如何月入过万不是梦

在TikTok&#xff08;简称TK&#xff09;这个充满活力的短视频平台上&#xff0c;想要实现大规模的商业价值&#xff0c;有效的账号管理和引流策略至关重要。而TK防关联引流系统的出现&#xff0c;无疑为众多品牌和营销者提供了一个高效、低成本的管理和增长解决方案。通过这一…

【51单片机】矩阵键盘

学习使用的开发板&#xff1a;STC89C52RC/LE52RC 编程软件&#xff1a;Keil5 烧录软件&#xff1a;stc-isp 开发板实图&#xff1a; 文章目录 矩阵键盘 矩阵键盘 矩阵键盘位于开发板的右下角 在键盘中按键数量较多时&#xff0c;为了减少I/O口的占用&#xff0c;通常将按键…

3des算法

使用3des算法&#xff0c;加密模式&#xff1a;CBC&#xff0c;填充&#xff1a;pkcs5padding /*** 3DES加解密类*/ class Des3phpService {//加密秘钥(base64加密)private $key ;//初始偏移向量private $iv;/*** 构造&#xff0c;传递二个已经进行base64_encode的KEY与IV** pa…

ETF申购赎回指南:详解注意事项与低费率券商推荐!

​ETF 申购&赎回 ETF申购赎回是个啥业务&#xff1f; 01 ETF申购、赎回是一种交易委托方式&#xff0c;指投资者通过申购方式(买入方向)获得ETF份额&#xff0c;通过赎回的方式&#xff08;卖出方向&#xff09;换掉/卖出ETF份额。ETF申购&#xff0c;通常是通过一篮子成…

基于Springboot的在线考试与学习交流平台的设计与实现

基于Springboot的在线考试与学习交流平台 开发语言&#xff1a;Java 框架&#xff1a;springboot JDK版本&#xff1a;JDK1.8 数据库&#xff1a;mysql 5.7 数据库工具&#xff1a;Navicat11 开发软件&#xff1a;idea 源码获取&#xff1a;https://download.csdn.net/downlo…

WebMvcConfigurationSupport和WebMvcConfigure

WebMvcConfigurationSupport和WebMvcConfigurer都是Spring MVC框架中用于配置MVC的组件&#xff0c;但它们之间存在显著的区别。以下是对这两者的详细比较&#xff1a; 一、定义与性质 WebMvcConfigurer ○定义&#xff1a;WebMvcConfigurer是Spring MVC中的一个接口&#xf…

基于单片机的家电远程控制系统的设计与实现

[ 摘 要 ] 本课题利用 51 单片机设计家电远程控制系统 。 通过软硬件相结合最终实现了通过手机与 GSM 模块通信控制继电器模拟家电开和关 , 为使系统相对操作和演示比较简单 。 整个系统设计功能完善 ,设计的成本较低, 并适用于各种家庭 , 具有一定的推广性 。 [ 关键…

计算机毕业设计django+大模型租房推荐系统 租房可视化 租房大屏可视化 租房爬虫 spark 58同城租房爬虫 房源推荐系统

开题报告&#xff1a;《Django大模型租房推荐系统》 一、研究背景与意义 随着城市化进程的加快&#xff0c;房屋租赁市场日益繁荣。然而&#xff0c;传统的房屋租赁方式存在信息不对称、交易流程繁琐等问题&#xff0c;给租户和房主带来了诸多不便。因此&#xff0c;开发一套…