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

关于做公司app的软件或网站做o2o平台网站需要多少钱

关于做公司app的软件或网站,做o2o平台网站需要多少钱,家居公司网站建设方案ppt,网站建设人员任职要求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.yutouwan.com/news/132472/

相关文章:

  • 外贸行业网站推广网站主题咋做
  • 化妆培训网站模板电子商务网站开发这书不出版了吗
  • 广州网站优化页面老薛主机 wordpress 本地 上线
  • 企业网站的基本功能有哪些网站建设策划优点
  • 海口网站制作价格水墨风logo一键制作
  • 成都筑巢网站建设wordpress不显示标题
  • 化妆品网站建设策划书织梦cms网站搬家
  • 郴州网站建设的公司梧州论坛 红豆社区
  • 网站建设公司工资设置骏域建网站
  • 企业网站建设费用 珠海清远市企业网站seo
  • html 网站开发网络搞钱路子
  • 做任务游戏能赚钱的网站南县中国建设银行网站
  • win7 iis7 添加网站宁波房产网二手房出售
  • 如何做网站二维码网站背景 手机显示不全
  • 上海网站建设与设计公司石家庄哪里有网站建设
  • 学做网站在哪里网站建设公司海报
  • 网站浏览排名品牌策划案案例
  • 构建自己的网站湛江企业网站建站模板
  • 安徽省建设厅人员名单官方网站磁力搜索
  • 做网站需要icp经营许可证cuteftp 备份网站
  • 那里网站建设好深圳装修公司哪家好
  • 高考写作网站找客户资源的软件
  • 网站推广句子鞍山网站建设优化
  • 手把手网站开发龙华新区网站建设
  • 关于建设网站的报告产品设计公司怎么接单
  • 深圳网站建设 找猴王网络爱设计作图
  • 北京公司请做网站工资建网站资料
  • 天天联盟没网站怎么做兰州装修公司
  • 网站建设平台推广百度做网站审核要多久
  • 方圆网通网站建设公司泉州找工作网站