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

铁岭建设网站四川省建设厅证书查询

铁岭建设网站,四川省建设厅证书查询,建盏公司最新消息,盘锦网站建设多少钱[Linux]线程池 文章目录 [Linux]线程池线程池的概念线程池的优点线程池的应用场景线程池的实现 线程池的概念 线程池是一种线程使用模式。线程池是一种特殊的生产消费模型#xff0c;用户作为生产者#xff0c;线程池作为消费者和缓冲区。 线程过多会带来调度开销#xff0c…[Linux]线程池 文章目录 [Linux]线程池线程池的概念线程池的优点线程池的应用场景线程池的实现 线程池的概念 线程池是一种线程使用模式。线程池是一种特殊的生产消费模型用户作为生产者线程池作为消费者和缓冲区。 线程过多会带来调度开销进而影响缓存局部和整体性能而线程池维护着多个线程等待着监督管理者分配可并发执行的任务。 线程池的优点 线程池避免了在处理短时间任务时创建与销毁线程的代价。线程池不仅能够保证内核充分利用还能防止过分调度。 注意 线程池中可用线程的数量应该取决于可用的并发处理器、处理器内核、内存、网络sockets等的数量。 线程池的应用场景 需要大量的线程来完成任务且完成任务的时间比较短。对性能要求苛刻的应用比如要求服务器迅速响应客户请求。接受突发性的大量请求但不至于使服务器因此产生大量线程的应用。 线程池的实现 下面我们实现一个简单的线程池线程池中提供了一个任务队列以及若干个线程多线程。 线程池中的多个线程负责从任务队列当中拿任务并将拿到的任务进行处理。线程池对外提供一个Push接口用于让外部线程能够将任务Push到任务队列当中。 线程池的代码如下 #pragma once#include iostream #include unistd.h #include pthread.h #include vector #include queueconst int N 5; // 线程池内线程数量template class T class ThreadPool { public:ThreadPool(int num N) : _num(num){pthread_mutex_init(_mutex, nullptr);pthread_cond_init(_cond, nullptr);}void LockQueue(){pthread_mutex_lock(_mutex);}void UnLockQueue(){pthread_mutex_unlock(_mutex);}void threadWait(){pthread_cond_wait(_cond, _mutex);}void threadWakeUP(){pthread_cond_signal(_cond);}T getTask(){T t _tasks.front();_tasks.pop();return t;}bool isEmpty(){return _tasks.empty();}static void *threadRoutine(void *args){pthread_detach(pthread_self());ThreadPoolT *tp static_castThreadPoolT *(args);while (true){tp-LockQueue();while (tp-isEmpty()){tp-threadWait();}T t tp-getTask();tp-UnLockQueue();t.Run();//任务处理}}void Start(){pthread_t tid;for (int i 0; i _num; i){pthread_create(tid, nullptr, threadRoutine, this);}}void PushTask(T task) // 添加任务{LockQueue();_tasks.push(task);threadWakeUP();UnLockQueue();}~ThreadPool(){pthread_mutex_destroy(_mutex);pthread_cond_destroy(_cond);}private:int _num; // 线程数std::queueT _tasks; // 任务队列pthread_mutex_t _mutex; // 保证互斥访问任务队列这一共享资源pthread_cond_t _cond; // 根据任务队列中的任务数量控制线程的等待和运行 };为什么线程池中需要有互斥锁和条件变量 互斥锁 任务队列是一个共享资源外部线程可以调用添加任务的接口访问任务队列线程池内部的线程可以直接访问任务队列处理任务可能会造成任务队列的并发访问问题因此需要利用互斥锁保护任务队列中的数据。 条件变量 线程池当中的线程要从任务队列里拿任务前提条件是任务队列中必须要有任务因此线程池当中的线程在拿任务之前需要先判断任务队列当中是否有任务若此时任务队列为空那么该线程应该进行等待直到任务队列中有任务时再将其唤醒因此我们需要引入条件变量。 当外部线程向任务队列中Push一个任务后此时可能有线程正处于等待状态因此在新增任务后需要唤醒在条件变量下等待的线程。 为什么线程池中的线程执行例程需要设置为静态方法 使用pthread_create函数创建线程时需要为创建的线程传入一个执行方法threadRoutine该执行方法只有一个参数类型为void的参数以及返回类型为void的返回值。 如果threadRoutine作为类的成员函数该函数的第一个参数是隐藏的this指针无法通过编译。而静态成员函数属于类而不属于某个对象也就是说静态成员函数是没有隐藏的this指针的因此我们需要将threadRoutine设置为静态方法此时threadRoutine函数才真正只有一个参数类型为void的参数。 但是在静态成员函数内部无法调用非静态成员函数而我们需要在threadRoutine函数当中调用该类的某些非静态成员函数。因此我们需要在创建线程时向threadRoutine函数传入的当前对象的this指针此时我们就能够通过该this指针在threadRoutine函数内部调用非静态成员函数了。 任务类型的设计 由于线程池编写的是模板化的因此任务类型可以是任意的但是由于处理任务的逻辑是通过调用任务的Run函数因此任务类中必须实现Run函数才能使用该线程池。 例如实现一个计算任务类如下 #include cstdlib #include iostreamclass Task { public:Task(int x, int y, char op) : _x(x), _y(y), _op(op), _result(0), _exitcode(0){}void Run()//对传入数据进行操作{switch (_op){case :_result _x _y;break;case -:_result _x - _y;break;case *:_result _x * _y;break;case /:if (_y 0) _exitcode -1;else_result _x / _y;break;case %:if (_y 0) _exitcode -2;else_result _x % _y;break;default:break;}std::string result std::to_string(_x) _op std::to_string(_y) std::to_string(_result) (exicode: std::to_string(_exitcode);std::cout result std::endl;}private:int _x;//左操作数int _y;//右操作数char _op;//操作符int _result;//算数结果int _exitcode;//退出码 };线程池内的线程在从任务队列拿出任务进行处理的过程并不需要关心这些任务的类型和来源只需要拿到任务后执行对应的Run方法即可。 主线程实现 主线程只需要不断向任务队列当中Push任务就行了此后线程池当中的线程会从任务队列当中获取到这些任务并进行处理。 #include ThreadPoolv1.hpp #include Task.hpp #include memory #include ctimeusing namespace std;int main() {std::unique_ptrThreadPoolTask tp(new ThreadPoolTask());tp-Start();time(nullptr);const char* ops -*/%;while(true){int x, y;x rand() % 50;y rand() % 50;char op ops[rand()%5];Task t(x, y, op);tp-PushTask(t);sleep(1);}return 0; }运行代码后会产生六个线程其中一个是主线程另外五个是线程池内处理任务的线程
http://www.dnsts.com.cn/news/65371.html

相关文章:

  • 机械类网站如何做网站优化网站建设计算机人员招聘
  • 公司做二手网站的用意千锋教育培训收费一览表
  • 河北省承德市建设局网站上不去网络公司开发软件
  • 网站网络优化外包怎么优化自己网站
  • 大名做网站中国电影家协会成员
  • 网站后台功能开发应用最广网站建设技术
  • 物流 东莞网站建设免费游戏网站建设游戏后台
  • 创新的天津网站建设建筑业企业所得税2%
  • 义乌市微畅网络科技有限公司西安做推广优化的公司
  • 南宁公司网站建设方案登陆建设官方网站
  • 网站建设费用大概多少钱衡阳市确诊名单
  • 隆昌移动网站建设南京谷歌seo
  • 文化传媒网站建设教做粘土的网站
  • 广州可以做票务商城的网站公司全网整合营销推广系统
  • ui设计作品欣赏网站成都注册网站公司
  • 门户网站建设招标文件网站制作推广方案
  • 阿里巴巴网站icp编号怎么查网上购物哪个平台最好
  • 青岛网站设计方案做网站挂广告 刷广告
  • 网站设置文件夹权限设置网站建设优化排名推广
  • 苏州知名网站建设建站公司怎么样创建自己的小程序
  • 后台网站开发文档wordpress 新闻模板
  • 京山网站设计公司音乐网页制作素材
  • 株洲企业网站建设费用凡科互动自助解封没用
  • 上海手机网站网站开发费用无形资产
  • 微信个人商城网站模板免费下载海南人才网
  • 彬县网站西安建设网站公司
  • 做电商要关注哪些网站网站建设 临沂
  • 专门做资产负债表结构分析的网站php网站迁移
  • 腾讯云wed服务器做网站wordpress丢失网络连接
  • 科技网站模板免费下载南安市网站建设