当前位置: 首页 > news >正文

高端网站建设公司增长可以做文档赚钱的网站

高端网站建设公司增长,可以做文档赚钱的网站,培训学校机构,延安软件开发公司#x1f4d7;线程池实现#xff08;单例模式#xff09; 1️⃣线程池概念2️⃣线程池代码样例3️⃣部分问题与细节#x1f538;类成员函数参数列表中隐含的this指针#x1f538;单例模式#x1f538;一个失误导致的bug 4️⃣调用线程池完成任务 1️⃣线程池概念 线程池是… 线程池实现单例模式 1️⃣线程池概念2️⃣线程池代码样例3️⃣部分问题与细节类成员函数参数列表中隐含的this指针单例模式一个失误导致的bug 4️⃣调用线程池完成任务 1️⃣线程池概念 线程池是一种线程使用模式。线程过多会带来调度开销进而影响缓存局部性和整体性能。而线程池维护着多个线程等待着监督管理者分配可并发执行的任务。这避免了在处理短时间任务时创建与销毁线程的代价。线程池不仅能够保证内核的充分利用还能防止过分调度。可用线程数量应该取决于可用的并发处理器、处理器内核、内存、网络sockets等的数量。 线程池的应用场景 需要大量的线程来完成任务且完成任务的时间比较短。 WEB服务器完成网页请求这样的任务使用线程池技术是非常合适的。因为单个任务小而任务数量巨大你可以想象一个热门网站的点击次数。 但对于长时间的任务比如一个Telnet连接请求线程池的优点就不明显了。因为Telnet会话时间比线程的创建时间大多了。对性能要求苛刻的应用比如要求服务器迅速响应客户请求。接受突发性的大量请求但不至于使服务器因此产生大量线程的应用。突发性大量客户请求在没有线程池情况下将产生大量线程虽然理论上大部分操作系统线程数目最大值不是问题短时间内产生大量线程可能使内存到达极限出现错误. 线程池示例 创建固定数量线程池循环从任务队列中获取任务对象获取到任务对象后执行任务对象中的任务接口 2️⃣线程池代码样例 以下为线程池代码 #pragma once#include iostream #include queue #include pthread.h #include ctimetemplateclass T class ThreadPool {private:std::queueT _q;//任务队列pthread_mutex_t _lock;pthread_cond_t _cond;//有任务时提醒线程执行任务static ThreadPoolT* _instance;ThreadPool(){} public:static ThreadPoolT* getInstance()//单例模式,饿汉模式,静态成员{static pthread_mutex_t mtx PTHREAD_MUTEX_INITIALIZER;if(nullptr _instance)//双if提高效率因为只有第一次获取_instance时才会实例化后续无需再加锁实例化_instance{pthread_mutex_lock(mtx);if(nullptr _instance){_instance new ThreadPoolT();}pthread_mutex_unlock(mtx);}return _instance;}void MutexInit(){pthread_mutex_init(_lock, nullptr);}void MutexLock(){pthread_mutex_lock(_lock);}void MutexUnLock(){pthread_mutex_unlock(_lock);}bool IsEmpty(){return _q.size() 0 ? true : false;}void ThreadWait(){pthread_cond_wait(_cond, _lock);}void ThreadWakeUp(){pthread_cond_signal(_cond);}void PopTask(T* out)//取任务{//此处不应加锁应为取任务的时候是带着锁的若此时申请锁会出现死锁现象*out _q.front();_q.pop();}//类内部的成员方法都有隐含的this参数因此要加上static修饰static void* Routine(void* args){ThreadPoolT* tp (ThreadPoolT*) args;//接收this指针pthread_detach(pthread_self());//线程分离while(true){tp-MutexLock();//加锁访问临界区_qwhile(tp-IsEmpty())//任务队列为空挂起等待{tp-ThreadWait();}//到此处说明有任务T t;tp-PopTask(t);tp-MutexUnLock();//退出临界区_qt();}return nullptr;}void ThreadPoolInit(int num)//初始化线程池{pthread_t p[num];for(int i 0; i num; i){pthread_create(p i, nullptr, Routine, this);//将this指针作为参数传入}}void PushTask(const T in){//分配任务MutexLock();_q.push(in);MutexUnLock();ThreadWakeUp();//唤醒线程完成任务}~ThreadPool(){pthread_mutex_destroy(_lock);} };templateclass T ThreadPoolT* ThreadPoolT::_instance nullptr;3️⃣部分问题与细节 下面分享一些在编写该单例模式线程池代码遇到的一些问题与细节 类成员函数参数列表中隐含的this指针 我们在初始化线程池的这部分代码需要创建若干线程来完成其所需要执行的任务这些线程的例程函数形式为void *(*start_routine) (void *) 其参数列表中仅有一个参数void*而如果将这个例程函数定义成成员函数会有一个隐含的this指针参数导致形式不一致因此需要将该例程函数用static修饰为静态的。 又因为静态成员函数只能访问静态成员变量故我们需要在创建线程时将this指针通过参数传递给例程函数这样才能在例程函数中使用this指针访问类中的成员变量。 单例模式 我们这个线程池设计成了单例模式并且采用的是饿汉模式即服务启动后只有在用到线程池这个功能时才会创建对象。而在单例模式创建对象时由于只有第一次创建对象时对象指针为nullptr故判断是否要创建对象指针的时候可以在加锁之前再进行一次判断提高效率而无需每次都要先加锁再判断。 一个失误导致的bug 在线程取任务的接口设计时我因为这里需要访问任务队列这个临界区给这个过程加上了锁但是实际上在调用这个接口的时候其实线程就已经申请加了锁而且两次申请的为同一把锁就导致出现了线程在已经持有一把锁的情况下又去申请这把锁从而产生了死锁。 4️⃣调用线程池完成任务 任务类 实现x 与 y 的 - * / % 五种运算。 #pragma once #include iostreamclass Task//x op y z {private:int x;int y;char op;//-*/%public:Task(){}Task(int _x, int _y, char _op):x(_x),y(_y),op(_op){}void operator()(){int z -1;switch (op){case /* constant-expression */:/* code */z x y;break;case -:z x - y;break;case *:z x * y;break;case /:if(0 ! y)z x / y;elsestd::cout warning: div zero error std::endl;break;case %:if(0 ! y)z x % y;elsestd::cout warning: div zero error std::endl;break;default:std::cout unkonwn operator std::endl;break;}std::cout [ pthread_self() ] handler task: x op y z std::endl;}~Task(){} };主函数 #include thread_pool.hpp #include Task.hpp #include string #include unistd.hint main() {srand((unsigned long)time(nullptr));ThreadPoolTask* tp ThreadPoolTask::getInstance();tp-ThreadPoolInit(5);const std::string s -*/%;while(true){int x rand() % 50;int y rand() % 50;char op s[rand() % 5];Task t(x, y, op);tp-PushTask(t);sleep(1);}return 0; }结果如上左侧为线程池中的线程每隔一秒取出任务并执行右侧为线程池的情况。
http://www.hkea.cn/news/14440820/

相关文章:

  • wordpress地址和站点地址错wordpress 域名更改 页面链接
  • 网站链接的基本形式松江新城建设发展有限公司网站
  • 佛山新网站制作市场拓者设计室内设计官网首页
  • wordpress后台如何登录优化水平
  • 外贸产品网站建设wordpress做客户端
  • 专门做实习计算机项目的网站平台品牌全案设计包括什么
  • 爱看视频的网站asp网站 模板
  • 做名片制作网站有什么a963中华室内设计官网
  • 网站建设公司上海做网站公司排名建设小辣猫的网站
  • 珠海网站建设杰作科技知名品牌网站有哪些
  • 网站建设费开票收候开在哪个类别里网页编辑器快捷键
  • 网站如何做映射南京装修公司十大排名榜
  • 石家庄网站公司wordpress 设置404页面模板
  • 网站开发安装环境青岛网站设计公司在哪找
  • 怎么自己创建网站天津网页设计教程
  • 做平台好还是做网站好滕州市建设局网站
  • 做任务得得q币的网站唐山建站公司
  • 换空间网站备案电商系统平台开发
  • 网站重复网站如何与支付宝对接
  • 公司网站制作工作室专业手机网站设计
  • 长春手机建站模板广州app开发费用
  • 怎样做网站导航栏wordpress采集发布
  • 南通市住房城乡建设局网站页面素材图片
  • app 与网站百度网盘客户端下载
  • 制作网站需要的技术dnf怎么做辅助网站
  • 企业网站的综合要求是什么个人网站建设服务器
  • 网站做标题有用吗怎样建设一个网站赚钱
  • 怎么做网站域名指向山西seo
  • 茂名专业做网站开县集团网站建设
  • 网站建设联系电话具有品牌的网站建设