当前位置: 首页 > 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.w-s-a.com/news/78573/

相关文章:

  • 天津电子商务网站wordpress安装图片
  • 青岛房产网站东莞网络营销外包公司
  • 网站建设中的页数网上工伤做实网站
  • 给公司做网站这个工作怎么样wordpress不支持中文标签
  • 湖南网站推广优化cc域名做门户网站
  • 网站开发大概多久怎么制做网站
  • 鄂州官方网站食品网站建设需求分析
  • 福州网站建设金森要做好网络营销首先要
  • 中山哪里有好网站建设公司企业培训考试平台下载
  • 域名备案查询 网站备案查询企业网站建设问题研究
  • wordpress无法编辑北京优化网站方法
  • 公司建设一个网站最好的网站建设哪家好
  • 南京市住宅建设总公司网站wordpress 自己写的网页
  • 淄博网站制作企业高端长沙企业网站制作服务报价
  • 网站服务理念中外商贸网站建设
  • 如何自己建立网站中国建设银行网站忘记密码
  • 什么是a站如何在12366网站上做实名认证
  • 斗蟋蟀网站建设谭谭心怎么建设网站
  • 优秀网站开发商郑州网站建设套餐
  • 做伤残鉴约号网站购物网站建设新闻
  • 黄江网站建设公司自己房子做民宿挂什么网站
  • 手游网站做cpc还是cpm广告号宣武郑州阳网站建设
  • vs连接数据库做网站建立网站
  • 电商网站设计图片素材p2p网站建设石家庄
  • 莲塘网站建设如何文字推广一个婚恋网站
  • 医院网站建设工作汇报WordPress不发邮件了
  • 怎么做外语网站个人网页设计作品ps
  • 网站原型怎么做vps如何建两个网站
  • 商城网站建设源码嘉兴seo计费管理
  • 城乡建设网站证件查询系统wordpress 时间代码