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

郑州做网站建设公司哪家好购买手机网站推荐

郑州做网站建设公司哪家好,购买手机网站推荐,为什么需要建设网站,wordpress关注功能http://blog.csdn.net/zouxinfox/article/details/3560891 什么时候需要创建线程池呢#xff1f;简单的说#xff0c;如果一个应用需要频繁的创建和销毁线程#xff0c;而任务执行的时间又非常短#xff0c;这样线程创建和销毁的带来的开销就不容忽视#xff0c;这时也是线…http://blog.csdn.net/zouxinfox/article/details/3560891 什么时候需要创建线程池呢简单的说如果一个应用需要频繁的创建和销毁线程而任务执行的时间又非常短这样线程创建和销毁的带来的开销就不容忽视这时也是线程池该出场的机会了。如果线程创建和销毁时间相比任务执行时间可以忽略不计则没有必要使用线程池了。     下面是Linux系统下用C语言创建的一个线程池。线程池会维护一个任务链表(每个CThread_worker结构就是一个任务)。     pool_init()函数预先创建好max_thread_num个线程每个线程执thread_routine ()函数。该函数中 while (pool-cur_queue_size  0) {       pthread_cond_wait ((pool-queue_ready),(pool-queue_lock)); } 表示如果任务链表中没有任务则该线程出于阻塞等待状态。否则从队列中取出任务并执行。pool_add_worker()函数向线程池的任务链表中加入一个任务加入后通过调用pthread_cond_signal ((pool-queue_ready))唤醒一个出于阻塞状态的线程(如果有的话)。pool_destroy ()函数用于销毁线程池线程池任务链表中的任务不会再被执行但是正在运行的线程会一直把任务运行完后再退出。下面贴出完整代码#include stdio.h #include stdlib.h #include unistd.h #include sys/types.h #include pthread.h #include assert.h /* *线程池里所有运行和等待的任务都是一个CThread_worker *由于所有任务都在链表里所以是一个链表结构 */ typedef struct worker {     /*回调函数任务运行时会调用此函数注意也可声明成其它形式*/     void *(*process) (void *arg);     void *arg;/*回调函数的参数*/     struct worker *next; } CThread_worker; /*线程池结构*/ typedef struct {     pthread_mutex_t queue_lock;     pthread_cond_t queue_ready;     /*链表结构线程池中所有等待任务*/     CThread_worker *queue_head;     /*是否销毁线程池*/     int shutdown;     pthread_t *threadid;     /*线程池中允许的活动线程数目*/     int max_thread_num;     /*当前等待队列的任务数目*/     int cur_queue_size; } CThread_pool; int pool_add_worker (void *(*process) (void *arg), void *arg); void *thread_routine (void *arg); static CThread_pool *pool  NULL; void pool_init (int max_thread_num) {     pool  (CThread_pool *) malloc (sizeof (CThread_pool));     pthread_mutex_init ((pool-queue_lock), NULL);     pthread_cond_init ((pool-queue_ready), NULL);     pool-queue_head  NULL;     pool-max_thread_num  max_thread_num;     pool-cur_queue_size  0;     pool-shutdown  0;     pool-threadid          (pthread_t *) malloc (max_thread_num * sizeof (pthread_t));     int i  0;     for (i  0; i  max_thread_num; i)     {          pthread_create ((pool-threadid[i]), NULL, thread_routine,                 NULL);     } } /*向线程池中加入任务*/ int pool_add_worker (void *(*process) (void *arg), void *arg) {     /*构造一个新任务*/     CThread_worker *newworker          (CThread_worker *) malloc (sizeof (CThread_worker));     newworker-process  process;     newworker-arg  arg;     newworker-next  NULL;/*别忘置空*/     pthread_mutex_lock ((pool-queue_lock));     /*将任务加入到等待队列中*/     CThread_worker *member  pool-queue_head;     if (member ! NULL)     {         while (member-next ! NULL)             member  member-next;         member-next  newworker;     }     else     {         pool-queue_head  newworker;     }     assert (pool-queue_head ! NULL);     pool-cur_queue_size;     pthread_mutex_unlock ((pool-queue_lock));     /*好了等待队列中有任务了唤醒一个等待线程     注意如果所有线程都在忙碌这句没有任何作用*/     pthread_cond_signal ((pool-queue_ready));     return 0; } /*销毁线程池等待队列中的任务不会再被执行但是正在运行的线程会一直 把任务运行完后再退出*/ int pool_destroy () {     if (pool-shutdown)         return -1;/*防止两次调用*/     pool-shutdown  1;     /*唤醒所有等待线程线程池要销毁了*/     pthread_cond_broadcast ((pool-queue_ready));     /*阻塞等待线程退出否则就成僵尸了*/     int i;     for (i  0; i  pool-max_thread_num; i)         pthread_join (pool-threadid[i], NULL);     free (pool-threadid);     /*销毁等待队列*/     CThread_worker *head  NULL;     while (pool-queue_head ! NULL)     {         head  pool-queue_head;         pool-queue_head  pool-queue_head-next;         free (head);     }     /*条件变量和互斥量也别忘了销毁*/     pthread_mutex_destroy((pool-queue_lock));     pthread_cond_destroy((pool-queue_ready));          free (pool);     /*销毁后指针置空是个好习惯*/     poolNULL;     return 0; } void * thread_routine (void *arg) {     printf (starting thread 0x%x/n, pthread_self ());     while (1)     {         pthread_mutex_lock ((pool-queue_lock));         /*如果等待队列为0并且不销毁线程池则处于阻塞状态; 注意         pthread_cond_wait是一个原子操作等待前会解锁唤醒后会加锁*/         while (pool-cur_queue_size  0  !pool-shutdown)         {             printf (thread 0x%x is waiting/n, pthread_self ());             pthread_cond_wait ((pool-queue_ready), (pool-queue_lock));         }         /*线程池要销毁了*/         if (pool-shutdown)         {             /*遇到break,continue,return等跳转语句千万不要忘记先解锁*/             pthread_mutex_unlock ((pool-queue_lock));             printf (thread 0x%x will exit/n, pthread_self ());             pthread_exit (NULL);         }         printf (thread 0x%x is starting to work/n, pthread_self ());         /*assert是调试的好帮手*/         assert (pool-cur_queue_size ! 0);         assert (pool-queue_head ! NULL);                  /*等待队列长度减去1并取出链表中的头元素*/         pool-cur_queue_size--;         CThread_worker *worker  pool-queue_head;         pool-queue_head  worker-next;         pthread_mutex_unlock ((pool-queue_lock));         /*调用回调函数执行任务*/         (*(worker-process)) (worker-arg);         free (worker);         worker  NULL;     }     /*这一句应该是不可达的*/     pthread_exit (NULL); } 下面是测试代码void * myprocess (void *arg) {     printf (threadid is 0x%x, working on task %d/n, pthread_self (),*(int *) arg);     sleep (1);/*休息一秒延长任务的执行时间*/     return NULL; } int main (int argc, char **argv) {     pool_init (3);/*线程池中最多三个活动线程*/          /*连续向池中投入10个任务*/     int *workingnum  (int *) malloc (sizeof (int) * 10);     int i;     for (i  0; i  10; i)     {         workingnum[i]  i;         pool_add_worker (myprocess, workingnum[i]);     }     /*等待所有任务完成*/     sleep (5);     /*销毁线程池*/     pool_destroy ();     free (workingnum);     return 0; } 将上述所有代码放入threadpool.c文件中在Linux输入编译命令$ gcc -o threadpool threadpool.c -lpthread以下是运行结果starting thread 0xb7df6b90thread 0xb7df6b90 is waitingstarting thread 0xb75f5b90thread 0xb75f5b90 is waitingstarting thread 0xb6df4b90thread 0xb6df4b90 is waitingthread 0xb7df6b90 is starting to workthreadid is 0xb7df6b90, working on task 0thread 0xb75f5b90 is starting to workthreadid is 0xb75f5b90, working on task 1thread 0xb6df4b90 is starting to workthreadid is 0xb6df4b90, working on task 2thread 0xb7df6b90 is starting to workthreadid is 0xb7df6b90, working on task 3thread 0xb75f5b90 is starting to workthreadid is 0xb75f5b90, working on task 4thread 0xb6df4b90 is starting to workthreadid is 0xb6df4b90, working on task 5thread 0xb7df6b90 is starting to workthreadid is 0xb7df6b90, working on task 6thread 0xb75f5b90 is starting to workthreadid is 0xb75f5b90, working on task 7thread 0xb6df4b90 is starting to workthreadid is 0xb6df4b90, working on task 8thread 0xb7df6b90 is starting to workthreadid is 0xb7df6b90, working on task 9thread 0xb75f5b90 is waitingthread 0xb6df4b90 is waitingthread 0xb7df6b90 is waitingthread 0xb75f5b90 will exitthread 0xb6df4b90 will exitthread 0xb7df6b90 will exit
http://www.zqtcl.cn/news/518552/

相关文章:

  • 欢迎访问中国建设银行网站个人客户网站建设需要经历什么步骤
  • 建设银行怀柔支行营业部网站企业官网手机版
  • cms那个做网站最好大连网站开发平台
  • 佛山建设外贸网站公司可信网站图标
  • 沈阳.....网站设计连云港优化网站团队
  • 网站添加白名单想学ui设计从哪里入手
  • 做期货与做网站的关系淮安市城市建设档案馆网站
  • 网站建设的技术亮点单位宣传册设计样本
  • 网站建设与维护服务敦化市建设局网站
  • 官方网站建设思路wordpress改成织梦
  • 网站建设推广方法网站调优
  • 苏州做企业网站wordpress前台发布文章
  • 怎么建个私人网站网络营销就业前景和薪水
  • 专业的网站开发团队京东电商平台
  • 做网站手机微信小程序怎么加入我的小程序
  • 做网站困难吗公司如何注册网站
  • 可信网站认证收费吗建设化工网站的目的
  • 查网站死链必用工具微信 wordpress
  • 做网站凡科新手如何开微商城店
  • 网站空间维护个人怎么注册一个品牌
  • 连云港网站设计城乡建设网站 资料员
  • 网络优化工程师有多累seo前线
  • 囊谦县公司网站建设新沂网页定制
  • 公众平台网页版wordpress换主题影响seo吗
  • 网站建设什么是静态网页设置wordpress文章标题高亮的代码
  • 男女做那事是什 网站wordpress怎么上传ppt
  • 电商网站图片处理东莞网络营销策划
  • 做知识产权相关的网站网站怎么做登录界面
  • 网站空间备份东莞企业网站教程
  • 新桥企业网站建设有关网站建设的毕业设计