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

做网站的股哥今日特大新闻新事

做网站的股哥,今日特大新闻新事,网页无法打开,免费vps试用一年线程池: ⼀种线程使⽤模式。线程过多会带来调度开销,进⽽影响缓存局部性和整体性能。⽽线程池维护着多个线程,等待着监督管理者分配可并发执⾏的任务。这避免了在处理短时间任务时创建与销毁线程的代价。线程池不仅能够保证内核的充分利⽤,还…

线程池:

        ⼀种线程使⽤模式。线程过多会带来调度开销,进⽽影响缓存局部性和整体性能。⽽线程池维护着多个线程,等待着监督管理者分配可并发执⾏的任务。这避免了在处理短时间任务时创建与销毁线程的代价。线程池不仅能够保证内核的充分利⽤,还能防⽌过分调度。可⽤线程数量应该取决于可⽤的并发处理器、处理器内核、内存、⽹络sockets等的数量。

线程池的本质是生产者消费者模型

线程池的应用场景:

  • 需要大量的线程来完成任务且完成任务的时间⽐较短。⽐如WEB服务器完成⽹⻚请求这样的任务,使⽤线程池技术是⾮常合适的。因为单个任务⼩,⽽任务数量巨⼤,你可以想象⼀个热⻔⽹站的点击次数。但对于⻓时间的任务,⽐如⼀个Telnet连接请求,线程池的优点就不明显了。因为 Telnet会话时间⽐线程的创建时间⼤多了
  • 对性能要求苛刻的应用,⽐如要求服务器迅速响应客⼾请求。
  • 接受突发性的⼤量请求,但不至于使服务器因此产生大量线程的应用。突发性⼤量客⼾请求,在没 有线程池情况下,将产⽣⼤量线程,虽然理论上⼤部分操作系统线程数⽬最⼤值不是问题,短时间 内产⽣⼤量线程可能使内存到达极限,出现错误.

线程池的种类

  1. 创建固定数量线程池,循环从任务队列中获取任务对象,获取到任务对象后,执行任务对象中 的任务接⼝
  2. 浮动线程池,其他同上

此处,我们选择固定线程个数的线程池。

线程池的主要成员:

1. 任务队列(存放接收任务)

2. vector管理线程

线程池退出步骤(问题):

  1. 先保证不再继续向任务队列中进任务
  2. 唤醒所有休眠的线程 ,让其处理完剩余任务

线程池初步   下一步就是向任务队列中入任务

#pragma once
#include <queue>
#include <iostream>
#include <string>
#include <vector> //用vector管理线程
#include <memory>
#include "log.hpp"
#include "Thread.hpp"
#include "Mutex.hpp"
#include "Cond.hpp"namespace ThreadPoolModule
{using namespace LockModule;using namespace ThreadModule;using namespace CondModule;using namespace LogModule;const static int defaultnum = 5;using thread_t = std::shared_ptr<Thread>;void Defaulttest(){while (true){LOG(LogLevel::INFO) << "test";sleep(1);}}template <typename T>class ThreadPool{public:ThreadPool(int num = defaultnum): _num(num){// 创建num个线程for (int i = 0; i < num; i++){_threads.push_back(std::make_shared<Thread>(Defaulttest));LOG(LogLevel::INFO) << "构建线程"<<_threads.back()->Name()<<"成功";}}~ThreadPool(){}//线程池启动void Start(){for(auto &thread_ptr: _threads){thread_ptr->Start();LOG(LogLevel::INFO) << "启动线程"<<thread_ptr->Name()<<"成功";}}//线程池回收线程void Wait(){for(auto &thread_ptr: _threads){thread_ptr->Join();}}//向线程池中传入任务void Enqueue(){}void Stop(){}private:int _num;                       // 线程个数std::queue<T> _taskq;           // 任务队列std::vector<thread_t> _threads; // 管理线程 ,其中是线程的指针};
}

测试

#include"ThreadPool.hpp"
#include<memory>using namespace ThreadPoolModule;int main()
{ENABLE_CONSOLE_LOG();std::unique_ptr<ThreadPool<int>> tp =std::make_unique<ThreadPool<int>>();tp ->Start();tp ->Wait();//tp->Enqueue();//tp->Stop();return 0;
}

最终实现

ThreadPool.hpp

#pragma once
#include <queue>
#include <iostream>
#include <string>
#include <vector> //用vector管理线程
#include <memory>
#include "log.hpp"
#include "Thread.hpp"
#include "Mutex.hpp"
#include "Cond.hpp"namespace ThreadPoolModule
{using namespace LockModule;using namespace ThreadModule;using namespace CondModule;using namespace LogModule;const static int defaultnum = 5;using thread_t = std::shared_ptr<Thread>;void Defaulttest(){while (true){LOG(LogLevel::INFO) << "test";sleep(1);}}template <typename T>class ThreadPool{private:bool IsEmpty(){return _taskq.empty();}// 执行任务void HandlerTask(std::string name){LOG(LogLevel::INFO)<<"线程"<< name <<"进入handlerTask";// 线程醒来就一直执行while (true){T t;{LockGuard lockguard(_mutex);while (IsEmpty() && _isrunning){_wait_num++;_cond.Wait(_mutex);_wait_num--;}// 任务队列为空 && 线程池退出了才退出    ,重要重要 if(IsEmpty() && !_isrunning)break;// 1.拿任务t = _taskq.front();_taskq.pop();}//在临界区外 ,处理任务 ,效率更高// 2.处理任务   规定传入的所有的任务, 必须提供()方法t(name);}LOG(LogLevel::INFO) << "线程: " << name << " 退出";}public:ThreadPool(int num = defaultnum): _num(num),_wait_num(0),_isrunning(false){// 创建num个线程for (int i = 0; i < num; i++){//bind  此时所有创建出来的线程,转而去执行HandlerTask_threads.push_back(std::make_shared<Thread>(std::bind(&ThreadPool::HandlerTask, this,std::placeholders::_1 )));LOG(LogLevel::INFO) << "构建线程" << _threads.back()->Name() << "成功";}}~ThreadPool(){}void Start(){if(_isrunning) return;_isrunning = true; // bug fix??for (auto &thread_ptr : _threads){thread_ptr->Start();LOG(LogLevel::INFO) << "启动线程" << thread_ptr->Name() << "成功";}}void Wait(){for (auto &thread_ptr : _threads){thread_ptr->Join();LOG(LogLevel::INFO) << "回收线程" << thread_ptr->Name() << "成功";}}//任务入队列void Enqueue(T &&in)//这个会被多线程调用 ,先加锁{//只要队列扛得住 ,就一直加LockGuard lockguard(_mutex);if(!_isrunning) return;_taskq.push(std::move(in));if(_wait_num > 0 ) _cond.Notify();}//退出线程池void Stop(){LockGuard lockguard(_mutex);if(_isrunning){// 3. 不能在入任务了_isrunning = false; // 不工作// 1. 让线程自己退出(要唤醒) && // 2. 历史的任务被处理完了if(_wait_num>0)_cond.NotifyAll();}}private:int _num;                       // 线程个数std::queue<T> _taskq;           // 任务队列  是临界资源std::vector<thread_t> _threads; // 管理线程 ,其中是线程的指针Mutex _mutex;Cond _cond;int _wait_num;bool _isrunning ;               //线程池的运行状态};
}

Main.cc

#include"ThreadPool.hpp"
#include<memory>
#include"Task.hpp"
using namespace ThreadPoolModule;int main()
{ENABLE_CONSOLE_LOG();//创建线程池std::unique_ptr<ThreadPool<task_t>> tp =std::make_unique<ThreadPool<task_t>>();//启动线程池tp ->Start();//传入任务int cnt =15;while(cnt--){tp->Enqueue(Push);sleep(1);}//线程池退出tp->Stop();//线程池回收线程tp ->Wait();return 0;
}

http://www.dtcms.com/wzjs/503234.html

相关文章:

  • 响应式中文网站欣赏国通快速建站
  • 企业建网站平台长沙seo网络营销推广
  • 做网站都需要租服务器吗网站推广优化排名教程
  • 家庭农场做网站的好处腾讯企业qq
  • 软件开发模型包括哪五种aso优化怎么做
  • 手机网站建设机构国外b站不收费免费2023
  • 怎么在自己的网站做淘宝客免费发seo外链平台
  • 福田网站建设设计公司长沙百度网站排名优化
  • 怎么用css做网站分片windows优化大师是病毒吗
  • 体育直播网站制作开发查询网站注册信息
  • 嘉峪关建设路小学网站外包网络推广
  • 动态网站的例子杭州市优化服务
  • 网站的建设技术有哪些内容seo建站收费地震
  • 南通做网站的花云seo网站优化价格
  • 创意响应式网站建设网页制作软件有哪些
  • 采集网站怎么做百度百度一下你就知道
  • 免费网站优化软件当日alexa排名查询统计
  • 网站建设 中企动力西安美国今天刚刚发生的新闻
  • ecshop二次开发厦门网站综合优化贵吗
  • 现在网站主怎么做淘宝客百度关键词排名快速排名
  • 什么装修网站做的好的销售新手怎么找客源
  • 用织梦做网站调用乱码sem分析是什么
  • 装潢设计就业前景正版搜索引擎优化
  • 如何设立邮箱和网站线上营销手段有哪些
  • 泉州网站优化排名最近的国内新闻
  • php在网站上怎么做充值世界杯比分查询
  • 网站制作者如何创建个人网页
  • 网站开发设计公百度快照在哪里找
  • 网站系统建设需要什么手机网站制作平台
  • 济南做网站找大标百度推广seo自学