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

提高网站建设管理水平番禺做网站多少钱

提高网站建设管理水平,番禺做网站多少钱,上海做网站建设公司,泽州县住房保障和城乡建设局网站目录 一、线程池实现原理 二、定义线程池的结构 三、创建线程池实例 四、添加工作的线程的任务函数 五、管理者线程的任务函数 六、往线程池中添加任务 七、获取线程池工作的线程数量与活着的线程数量 八、线程池的销毁 一、线程池实现原理 线程池的组成主要分为3个部…目录 一、线程池实现原理 二、定义线程池的结构 三、创建线程池实例 四、添加工作的线程的任务函数 五、管理者线程的任务函数 六、往线程池中添加任务 七、获取线程池工作的线程数量与活着的线程数量 八、线程池的销毁 一、线程池实现原理 线程池的组成主要分为3个部分。这三部分配合工作就可以得到一个完整的线程池: 1、任务队列存储需要处理的任务。由工作的想程来处理这些任务 通过线程池提供的API函数将一个待处理的任务添加到任务队列或者从任务队列中删除已处理的任务会被从任务队列中删除线程池的使用者也就是调用线程池函数往任务队列中添加任务的线程就是生产者线程 2、工作的线程 (任务队列任务的消费者)N个 线程池中维护了一定数量的工作线程他们的作用是不停的读任务队列从里边取出任务并处理工作的线程相当于是任务队列的消费者角色如果任务队列为空工作的线程将会被阻塞(使用条件变量/信号量阻塞)如果阻塞之后有了新的任务由生产者将阻塞解除工作线程开始工作 3、管理者线程(不处理任务队列中的任务)1个 它的任务是周期性的对任务队列中的任务数量以及处于忙状态的工作线程个数进行检测 ——当任务过多的时候可以适当的创建一些新的工作线程 ——当任务过少的时候可以适当的销毁一些工作的线程 二、定义线程池的结构 #include threadpool.h//任务结构体 typedef struct Task {void (*function) (void* arg);void* arg; }Task;//线程池结构体 struct ThreadPool {//任务队列Task* taskQ;int queueCapacity; //容量int queueSize; //当前任务个数int queueFront; //队头-取数据int queueRear; //队尾-放数据pthread_t managerID; //管理者线程IDpthread_t *threadIDs; //工作的线程IDint minNum; //最小线程数量int maxNum; //最大线程数量int busyNum; //忙的线程的个数int liveNum; //存活的线程的个数int exitNum; //要销毁的线程个数pthread _mutex_t mutexPool; //锁整个的线程池pthread_mutex_t mutexBusy; //锁busyNum变量 pthread_cond_t notFull; //任务队列是不是满了pthread_cond_t notEmpty; //任务队列是不是空了int shutdown; //是不是要销毁线程池销毁为1不销毁为0 };三、创建线程池实例 typedef struct ThreadPool ThreadPool; ThreadPool* threadPoolCreate(int min, int max, int queueSize) {ThreadPool* pool(ThreadPool*)malloc(sizeof (ThreadPool));do{if (pool NULL){printf ( malloc threadpool fail ... \n);break;}pool-threadIDs (pthread_t *) malloc(sizeof(pthread_t) *max);if(pool-threadIDs NULL){printf (malloc threadIDs fail ... \n);break;}memset(pool-threadIDs,0, sizeof (pthread_t) * max);pool-minNum min;pool-maxNum max;pool-busyNum 0;pool-liveNum min; //和最小个数相等pool-exitNum 0;if (pt.hread _mutex_init ( pool-mutexPool,NUTI) !0 ||pthread_mutex_init ( pool-mutexBusy,NULL) !0 ||pthread_cond_init (pool-notEmpty,NULL) !0 ||pthread_cond_init ( pool-notFullNULL) !0 ){ printf ( mutex or condition init fail ...\n);break;}//任务队列pool-taskQ malloc(sizeof (Task) * queueSize);pool-queueCapacity qucuesizo;pool-queueSize 0;pool-queueFront 0;pool-queueRear 0;pool-shutdown 0;//创建线程pthread_create ( pool-managerID,NULL,manager,NULL);for (int i 0; i min; i){pthread create (pool-threadIDs[i]NULL,worker,NULL);}}whiie (O);//释放资源if(pool pool-threadIDs) free(pool-threadIDs);if(pool pool-taskQ) free(pool-taskQ);if(pool) free(pool);return NULL; }四、添加工作的线程的任务函数 void* worker (void* arg) {ThreadPool* pool (ThreadPool*)arg;while (1){pthread_ mutex_lock(pool-mtexPool) ;!当前任务队列是否为空while (pool-queuesize 0 !pool-shutdown ){//阻塞工作线程pthread_cond_wait(pool-notEmpty, pool-mutexPool);//判断是不是要销毁线程if (pool-exitNum 0){pool-exitNum--;pthread_ mutex_unlock(pool-mtexPool) ;!当前任务队列是否为空pthread_exit (NULL);}}//判断线程池是否被关闭了if (pool-shutdown ){pthread_mutex_unlock(pool-mutexPool);pthread_exit(NULL);}//从任务队列中取出一个任务Task task;task.function pool-taskQ[pool-queueFront].function;task.arg pool-taskQ[pool-queueFront].arg;//移动头结点pool-queueFront (pool-queueFront 1) % pool-queueCapacity;pool-queuesize--;//解锁pthread_cond_signal(pool-notFull);pthread_mutex_unlock(pool-mutexPool);printf(thread %ld start working ...\n);pthread mutex_lock (pool-mutexBusy);pool-busyNum;pthread mutex_unlock (pool-mutexBusy) ;task.function(task.arg) ; //或者 (*task.function) (task.arg) 进行调用;free(task.arg);task.argNULL;printf(thread %ld end working ...\n);pthread_mutex_lock (pool-mutexBusy);pool-busyNum--;pthread mutex_unlock (pool-mutexBusy) ; }return NULL; }五、管理者线程的任务函数 const int NUMBER 2; void* manaqer(void* arg) {ThreadPool* pool (ThreadPool)arg;while(!pool-shutdown){//每隔3s检测一次sleep(3);//取出线程池中任务的数量和当前线程的数量pthread_mutex_lock(pool-muatexPool) ;int queueSize pool-queuesize;int liveNum pool-liveNum;pthread_mutex_unlock( pool-mutexPool) ;//取出忙的线程的数量pthread_mutex_lock(pool-mutexBusy);int busyNum pool-busyNum;pthread_mutex__lock(pool-mutexBusy) ;//添加线程// 任务的个数 存活的线程个数 存活的线程数 最大线程数if (queueSize liveNum liveNum pool-maxNum){pthread_mutex_lock(pool-mutexPool);int counter 0;for (int i 0; i pool-maxNum counter NUMBER pool-liveNum pool-maxNum ; i){if (pool-threadIDs[i] 0){pthread_create( pool-threadIDs[i]NULI,worker, pool);counter;pool-liveNum;}}pthread_mutex_unlock(pool-mutexPool);}// 销毁线程// 忙的线程*2 存活的线程数 存活的线程 最小线程数if(busyNum * 2 liveNum liveNum pool-minNum){pthread_mutex_lock(pool-mutexPool);pool-exitNum NUMBER;pthread_mutex_unlock(pcol-mutexPool);// 让工作的线程自杀Ifor(int i0;iNUMBER; i){pthread_cond_signal(pool-notEmpty);}}} }六、往线程池中添加任务 void threadPoolAdd(ThreadPool* pool,void (*func)(void*), void* arg) {pthread_mutex_lock(pool-mutexPool);while(pool-queueSize pool-queueCapacity !pool-shutdown){//阻塞生产者线程pthread_cond_wait( pool-notFull,pool-mutexPool) ;}if (pool-shutdown){pthread_mutex_unlock ( pool-mutexPool) ;return;}//添加任务pool-taskQ[pool-queueRear].function func;pool-taskQ[pool-queueRear].arg arg;pool-queueRear (pool-queueRear 1) % pool-queueCapacity;pool-queuesize;pthread_cond_signal( pool-notEmpty);pthread_mutex_unlock(pool-mutexPool) ; }七、获取线程池工作的线程数量与活着的线程数量 //获取线程池中工作的线程数量 int threadPoolBusyNum ( ThreadPool* pool) {pthread_mutex_lock(pool-mutexBusy);int busyNum pool-busyNum;pthread_mutex_unlock(pool-mutexBusy);return busyNum; }//获取线程池中活着的线程数量 int threadPoolAliveNum (ThreadPool*pool) {pthread_mutex_lock(pool-mutexPool);int busyNum pool-liveNum;pthread_mutex_unlock(pool-mutexPool);return aliveNum; }八、线程池的销毁 int threadPoolDestroy (ThreadPool* pool) {if(pool NULL){return -1;}//关闭线程池pool-shutdown 1;//阻塞回收管理者线程pthread_join(pool-nanagerID,NULL);//唤醒阻塞的消费者线程for (int i 0; i pool-liveNum; i){pthread_cond_signal( pool-notEmpty) ;}//释放堆内存if(pool-taskQ){free(pool-taskQ);pool-taskQNULL;}if(pool-threadIDs){free(pool-threadIDs);pool-threadIDsNULL;}free(pool);poolNULL;pthread_mutex_destroy( pool-mutexPool);pthread_mutex_destroy( pool-mutexBusy);pthread_cond_ destroy( pool-notEmpty);pthread_cond_destroy ( pool-notFull);return 0; }
http://www.yutouwan.com/news/280425/

相关文章:

  • 做网站建设需要网站优化怎么做分录
  • 网站审批公司建设电商型网站的作用
  • 一个域名一个ip做多个网站南京企业网站开发
  • 那个网站做h5不要钱无锡企业网站建设
  • 网站建设需求怎么写郑州便民网
  • 一流的网站建设公司软件开发是什么行业
  • 如何挑选网站主机Wordpress500页面
  • 眼科医院网站做竞价带来的询盘量苏州建设工程材料信息价
  • 终身免费建站注册网址
  • 还能用的wap网站深圳做网站的网络公司
  • 傻瓜式免费自助建站系统深圳布吉做网站
  • 用vps建网站备案centos yum wordpress
  • 买完域名怎么创建网站建设银行官网电话
  • php建站软件哪个好计算机专业毕业设计做什么好
  • 网站建设设计费用网站开发者工具下载
  • aspnet网站开发实例教程pdf济宁网站排名
  • 简洁的个人网站做一个交易网站要花多少钱
  • 网页网站自做全搞定wordpress产品页插件
  • 登录广东省建设监理协会网站首页永安市住房与城乡建设局网站
  • 菠菜网站的代理怎么做建筑工程公司有什么职位
  • 洛阳霞光高端定制网站建设天河网站建设哪家好
  • 怎样怎样优化网站建设网站建设存在的问题和不足
  • 网站开发学生鉴定表如何介绍自己做的网站
  • 网站建设 工商注册凡科互动app下载
  • ueditor wordpress4.5郑州网站关键词优化外包
  • 新网站百度搜不到我想开网店需要怎么做
  • 网站开发需要的人员做网站怎么宣传运营
  • asp.net网站开发流程及相关工具六安网站建设培训
  • 搭建网站的架构广州公司网页制作
  • 医院网站和公众号建设方案可以做数学题的网站