当前位置: 首页 > news >正文 o2o网站建设平台指定关键词seo报价 news 2025/10/30 10:36:27 o2o网站建设平台,指定关键词seo报价,wordpress签到积分,凡科建站手机版登录#x1f4dd;前言#xff1a; 这篇文章我们来讲讲Linux——基于单例模式的线程池设计 #x1f3ac;个人简介#xff1a;努力学习ing #x1f4cb;个人专栏#xff1a;Linux #x1f380;CSDN主页 愚润求学 #x1f304;其他专栏#xff1a;C学习笔记#xff0c;C语言…前言 这篇文章我们来讲讲Linux——基于单例模式的线程池设计 个人简介努力学习ing 个人专栏Linux CSDN主页 愚润求学 其他专栏C学习笔记C语言入门基础python入门基础C刷题专栏 这里写目录标题 一设计框架1. 总体框架2. 线程池模块2.1 什么是线程池2.2 设计思路 3. 什么是单例模式3.1 饿汉模式3.2 懒汉模式更推荐 二实现代码三测试结果四线程安全和重入问题五、锁的其他问题1. 死锁问题2. 死锁四个必要条件3. 避免死锁 六、STL和智能指针的线程安全 一设计框架 1. 总体框架 我们需要的模块 日志Mylog用于DEBUG线程MyThread用于生成多个线程线程池ThreadPool利用前两个模块来实现一个线程池 2. 线程池模块 2.1 什么是线程池 线程池 是一种多线程处理模式属于池化技术的一种。它通过提前创建并管理一定数量的线程重复利用这些线程处理任务避免了频繁创建和销毁线程的开销从而提升系统性能和资源利用率 2.2 设计思路 我们用一个queue来存储待处理的任务用一个vector来存储线程 3. 什么是单例模式 某些类, 只应该具有⼀个对象(实例), 就称之为单例 通常把构造函数拷贝赋值…设置成私有或者直接禁用在外部无法创建实例只保留一个static实例成员这样类在被加载的时候这个实例就存在了。static成员不属于任何一个对象而属于类只有一份 注意static成员的初始化是在类外的但是属于类的一部分可以访问类的私有成员 然后提供一个public的接口来返回这个实例给外部使用 3.1 饿汉模式 加载类的时候直接创建整个static实例成员问题如果静态实例的体积大则加载时间长 3.2 懒汉模式更推荐 延迟加载我只定义静态成员实例的指针。当真正使用到这个成员时再创建并赋值给指针这样可以提高内存使用率 即在GetInstance时发现指针为空再创建 可是还有几个设计上的问题 没有实例我们怎么调GetInstance创造实例 所以GetInstance也是Static的 获取实例不是线程安全的要加锁不然可能创建多个实例 这个锁是什么锁也需要是static的锁因为没实例的时候拿不到类的锁。 二实现代码 细节我就不讲了感兴趣的可以看注释 #pragma once #include MyThread.hpp #include Mylog.hpp #include vector #include queue #include Task.hpp #include mutex #include condition_variable// 先不考虑单例模式 using namespace std; using namespace tr;template typename T // 任务类型 class ThreadPool { private:ThreadPool(int th_num 3): _th_num(th_num),_isrunning(false),_wait_thread(0){}void HandlerTask() // 单个线程处理任务的方法{while (true){LOG(LogLevel::DEBUG) GetThreadName() is running;_mutex.lock();while (_tasks_queue.empty() _isrunning) // 条件变量一定要注意虚假唤醒{_wait_thread;// LOG(LogLevel::DEBUG) GetThreadName() is waiting;_cond.wait(_mutex);// LOG(LogLevel::DEBUG) GetThreadName() is waked;_wait_thread--; // 如果等待被唤醒(唤醒是由别的地方唤醒的)}// 如果还有任务就先不退if (_tasks_queue.empty() !_isrunning){_mutex.unlock(); // 尽早释放锁LOG(LogLevel::DEBUG) GetThreadName() quit;break;}T t _tasks_queue.front();_tasks_queue.pop();_mutex.unlock(); // 尽早释放锁LOG(LogLevel::DEBUG) GetThreadName() 获得一个任务...;t(); // 处理任务}}void Start() // 启动线程池{if (!_isrunning){LOG(LogLevel::DEBUG) 启动线程池...;_isrunning true;// 必须要先开空间因为扩容不是线程安全的// 1. 创建 Mythread 对象// 2. 启动线程线程开始执行HandlerTask// 3. vector扩容移动现有线程对象原来的迭代器失效// 如果 3. 的时候有线程在执行 HandlerTask则原 this 指针会失效导致段错误// 以上为个人理解_threads.reserve(_th_num);// lock_guardmutex lock(_mutex); 不能这样做又是为什么呢for (int i 0; i _th_num; i){// 用 HandlerTask需要捕捉 this指针 构造 Mythread 临时对象隐式类型转换_threads.emplace_back([this](){HandlerTask();});}}elseLOG(LogLevel::DEBUG) 线程池已经启动, 请勿重复启动...;}// 禁用拷贝和赋值ThreadPoolT operator(const ThreadPoolT ) delete;ThreadPool(const ThreadPoolT ) delete;public:static ThreadPoolT *GetInstance(){if (_instance nullptr){_lock.lock();if (_instance nullptr) // 双层 if 判断只有一个线程能拿到锁进入这里不会全部线程都通过这个判断{_instance new ThreadPoolT();_instance-Start(); // 启动线程池LOG(LogLevel::DEBUG) 创建线程池单例 ;return _instance;}}LOG(LogLevel::DEBUG) 获取线程池单例;return _instance;}void Stop() // 暂停结束线程池{lock_guardmutex lock(_mutex);if (!_isrunning)return;_isrunning false;// 唤醒所有线程让线程知道 _isrunning 已经为 false 了_cond.notify_all();LOG(LogLevel::INFO) 线程池退出...;}void Wait() // 等待所有线程{for (auto th : _threads){// LOG(LogLevel::INFO) th.GetName() 退出...;th.Join();}}void Enqueue(const T task) // 入队任务{lock_guardmutex lock(_mutex);if (_isrunning){_tasks_queue.push(task);// LOG(LogLevel::INFO) 插入了一个任务;if (_wait_thread 0)_cond.notify_one();}}~ThreadPool(){}private:bool _isrunning;queueT _tasks_queue;vectorMythread _threads;int _th_num; // 线程数量int _wait_thread;mutex _mutex; // 标准库的锁不用初始化condition_variable_any _cond;static ThreadPoolT *_instance; // 静态成员实例static mutex _lock; };template typename T // 模板类静态成员初始化必须带 template typename T, 因为模版要实例化 ThreadPoolT *ThreadPoolT::_instance nullptr; // 还要声明模版的作用域 template typename T mutex ThreadPoolT::_lock;主体代码为上面这部分的如果想要获取其中其他模块的代码可以访问我的GIthub 三测试结果 四线程安全和重入问题 线程安全描述线程就是多个线程在访问共享资源时能够正确地执行不会相互干扰或破坏彼此的执行结果。一般而言多个线程并发同一段只有局部变量的代码时不会出现不同的结果。但是对全局变量或者静态变量执行操作并且没有锁保护的情况下容易出现该问题 重入描述函数同一个函数被不同的执行流调用当前一个流程还没有执行完就有其他的执行流再次进⼊我们称之为重⼊。一个函数在重⼊的情况下运行结果不会出现任何不同或者任何问题则该函数被称为可重入函数否则是不可重入函数 重入分两种 多线程重入函数信号导致⼀个执行流重复进入函数 线程安全不一定是可重入的而可重入函数则⼀定是线程安全的。 五、锁的其他问题 1. 死锁问题 死锁是指在⼀组进程中的各个进程均占有不会释放的资源但因互相申请被其他进程所站⽤不会释放的资源⽽处于的⼀种永久等待状态。 比如一个公共资源的访问需要两把锁但是现在线程 A 和线程 B各自占一个并且都不愿意放还不断申请对方的导致两者都申请不到造成死锁 还比如单线程死锁自己带着锁还自己把自己挂起了 2. 死锁四个必要条件 互斥条件一个资源每次只能被一个执行流使用请求与保持条件一个执行流因请求资源而阻塞时对已获得的资源保持不放不剥夺条件一个执行流已获得的资源在未使用完之前不能强行剥夺循环等待条件若干执行流之间形成一种头尾相接的循环等待资源的关系 3. 避免死锁 那就是破坏死锁的四个必要条件使之不满足… 有避免死锁的算法银行家算法、死锁检测算法这里不做介绍 六、STL和智能指针的线程安全 STL 容器不是线程安全的比如扩容等操作是可能被切换的智能指针本身是线程安全的但是它们所指向的资源不是线程安全的 我的分享也就到此结束啦 要是我的分享也能对你的学习起到帮助那简直是太酷啦 若有不足还请大家多多指正我们一起学习交流 公主王子点赞→收藏⭐→关注 感谢大家的观看和支持祝大家都能得偿所愿天天开心 文章转载自: http://www.morning.spfh.cn.gov.cn.spfh.cn http://www.morning.ccsdx.cn.gov.cn.ccsdx.cn http://www.morning.sfhjx.cn.gov.cn.sfhjx.cn http://www.morning.lpcpb.cn.gov.cn.lpcpb.cn http://www.morning.ptwzy.cn.gov.cn.ptwzy.cn http://www.morning.hrtfz.cn.gov.cn.hrtfz.cn http://www.morning.xqgfy.cn.gov.cn.xqgfy.cn http://www.morning.bnlch.cn.gov.cn.bnlch.cn http://www.morning.bqpgq.cn.gov.cn.bqpgq.cn http://www.morning.wpsfc.cn.gov.cn.wpsfc.cn http://www.morning.sdkaiyu.com.gov.cn.sdkaiyu.com http://www.morning.mfxcg.cn.gov.cn.mfxcg.cn http://www.morning.gmmxh.cn.gov.cn.gmmxh.cn http://www.morning.kzrbd.cn.gov.cn.kzrbd.cn http://www.morning.mqfw.cn.gov.cn.mqfw.cn http://www.morning.qiyelm.com.gov.cn.qiyelm.com http://www.morning.fbrshjf.com.gov.cn.fbrshjf.com http://www.morning.qwnqt.cn.gov.cn.qwnqt.cn http://www.morning.kpcdc.cn.gov.cn.kpcdc.cn http://www.morning.fwcnx.cn.gov.cn.fwcnx.cn http://www.morning.bfjtp.cn.gov.cn.bfjtp.cn http://www.morning.vvdifactory.com.gov.cn.vvdifactory.com http://www.morning.dpzcc.cn.gov.cn.dpzcc.cn http://www.morning.mswkd.cn.gov.cn.mswkd.cn http://www.morning.tftw.cn.gov.cn.tftw.cn http://www.morning.nkkr.cn.gov.cn.nkkr.cn http://www.morning.tqwcm.cn.gov.cn.tqwcm.cn http://www.morning.ghxzd.cn.gov.cn.ghxzd.cn http://www.morning.lnmby.cn.gov.cn.lnmby.cn http://www.morning.dwncg.cn.gov.cn.dwncg.cn http://www.morning.lxhgj.cn.gov.cn.lxhgj.cn http://www.morning.fjfjm.cn.gov.cn.fjfjm.cn http://www.morning.ppwdh.cn.gov.cn.ppwdh.cn http://www.morning.vnuwdy.cn.gov.cn.vnuwdy.cn http://www.morning.mcbqq.cn.gov.cn.mcbqq.cn http://www.morning.kbdrq.cn.gov.cn.kbdrq.cn http://www.morning.dkfb.cn.gov.cn.dkfb.cn http://www.morning.blbys.cn.gov.cn.blbys.cn http://www.morning.lqytk.cn.gov.cn.lqytk.cn http://www.morning.mytmn.cn.gov.cn.mytmn.cn http://www.morning.gwkwt.cn.gov.cn.gwkwt.cn http://www.morning.4q9h.cn.gov.cn.4q9h.cn http://www.morning.xskbr.cn.gov.cn.xskbr.cn http://www.morning.yzxlkj.com.gov.cn.yzxlkj.com http://www.morning.kgphd.cn.gov.cn.kgphd.cn http://www.morning.hcgbm.cn.gov.cn.hcgbm.cn http://www.morning.ey3h2d.cn.gov.cn.ey3h2d.cn http://www.morning.wjlhp.cn.gov.cn.wjlhp.cn http://www.morning.smqjl.cn.gov.cn.smqjl.cn http://www.morning.dbrdg.cn.gov.cn.dbrdg.cn http://www.morning.qblcm.cn.gov.cn.qblcm.cn http://www.morning.fstdf.cn.gov.cn.fstdf.cn http://www.morning.tqbqb.cn.gov.cn.tqbqb.cn http://www.morning.brmbm.cn.gov.cn.brmbm.cn http://www.morning.rycd.cn.gov.cn.rycd.cn http://www.morning.yxwcj.cn.gov.cn.yxwcj.cn http://www.morning.rjjys.cn.gov.cn.rjjys.cn http://www.morning.rnnwd.cn.gov.cn.rnnwd.cn http://www.morning.rlbg.cn.gov.cn.rlbg.cn http://www.morning.hgkbj.cn.gov.cn.hgkbj.cn http://www.morning.jbztm.cn.gov.cn.jbztm.cn http://www.morning.mlnby.cn.gov.cn.mlnby.cn http://www.morning.lswgs.cn.gov.cn.lswgs.cn http://www.morning.fwgnq.cn.gov.cn.fwgnq.cn http://www.morning.yjdql.cn.gov.cn.yjdql.cn http://www.morning.sqnrz.cn.gov.cn.sqnrz.cn http://www.morning.mnyzz.cn.gov.cn.mnyzz.cn http://www.morning.jgykx.cn.gov.cn.jgykx.cn http://www.morning.zzgtdz.cn.gov.cn.zzgtdz.cn http://www.morning.nlygm.cn.gov.cn.nlygm.cn http://www.morning.fgwzl.cn.gov.cn.fgwzl.cn http://www.morning.bsjpd.cn.gov.cn.bsjpd.cn http://www.morning.znqfc.cn.gov.cn.znqfc.cn http://www.morning.mjyrg.cn.gov.cn.mjyrg.cn http://www.morning.xpqyf.cn.gov.cn.xpqyf.cn http://www.morning.cnqff.cn.gov.cn.cnqff.cn http://www.morning.ltpzr.cn.gov.cn.ltpzr.cn http://www.morning.yzygj.cn.gov.cn.yzygj.cn http://www.morning.ckzjl.cn.gov.cn.ckzjl.cn http://www.morning.rkhhl.cn.gov.cn.rkhhl.cn 查看全文 http://www.tj-hxxt.cn/news/262105.html 相关文章: 海外微网站建设绵阳欣诚建设 海澜之家网站建设水平安装wordpress后加固 广州专业建设网站pc端网站建设价格明细表 没有公网ip做网站网站建设开票写什么 河南做外贸网站的公司简介短视频网站建设方案 自己建设企业网站怀化网站优化公司有哪些 山东省建设厅网站微博营销的优势和劣势 电器网站建设目的php网站开发程序填空题 面对撞库 网站应该怎么做营销型网站建设实训报告个人总结 河北邯郸seo网站建设网站优化wordpress网页打开加快 大淘客构建自己的网站云南网站建设哪个好 视频门户网站建设项目标书质控中心网站建设申请 手机网站怎么导入微信wordpress刷权重插件 自己提供域名做网站服务器网站建设教程 成都网站建设定制开发系统购买友情链接 丰台公司做网站官网模板免费下载 凤岗网站设计网站一般建什么 企业移动网站制作白银网站运行 怎样建企业网站wordpress文本编辑器哪个好 青岛的公司大泽山seo快速排名 多语言企业网站保山网站建设服务 陕西省门户网站建设政策成都有几个区 有学做美食的网站吗内容营销模式 wordpress固定菜单栏寰宇seo 网站建设的基本技术flash网站轮播广告怎么做 西红门网站建设网站云空间大小 高品质的网站开发公做的网站怎么让百度收录 wordpress采集站网站404做多大 建设主管部门官方网站化妆品公司网站设计 加盟网站制作公司运城哪里做网站