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

做网站做手机app要学什么软件网站平台怎么推广

做网站做手机app要学什么软件,网站平台怎么推广,android开发流程,wordpress多个主体功能合并1.线程池基本原理 在传统服务器结构中, 常是 有一个总的 监听线程监听有没有新的用户连接服务器, 每当有一个新的 用户进入, 服务器就开启一个新的线程用户处理这 个用户的数据包。这个线程只服务于这个用户 , 当 用户与服务器端关闭连接以后, 服务器端销毁这个线程。然而频繁地… 1.线程池基本原理 在传统服务器结构中, 常是 有一个总的 监听线程监听有没有新的用户连接服务器, 每当有一个新的 用户进入, 服务器就开启一个新的线程用户处理这 个用户的数据包。这个线程只服务于这个用户 , 当 用户与服务器端关闭连接以后, 服务器端销毁这个线程。然而频繁地开辟与销毁线程极大地占用了系统的资源。而且在大量用户的情况下, 系统为了开辟和销毁线程将浪费大量的时间和资源。线程池提供了一个解决外部大量用户与服务器有限资源的矛盾, 线程池和传统的一个用户对应一 个线程的处理方法不同, 它的基本思想就是在程序 开始时就在内存中开辟一些线程, 线程的数目是 固定的,他们独自形成一个类, 屏蔽了对外的操作, 而服务器只需要将数据包交给线程池就可以了。当有新的客户请求到达时 , 不是新创建一个线程为其服务 , 而是从“池子”中选择一个空闲的线程为新的客户请求服务 ,服务完毕后 , 线程进入空闲线程池中。如果没有线程空闲 的 话, 就 将 数 据 包 暂 时 积 累 , 等 待 线 程 池 内 有 线 程空闲以后再进行处理。通过对多个任务重用已经存在的线程对象 , 降低了对线程对象创建和销毁的开销。当客户请求 时 , 线程对象 已 经 存 在 , 可 以 提 高 请 求 的响应时间 , 从而整体地提高了系统服务的表现。 一般来说实现一个线程池主要包括以下几个组成部分 1线程管理器用于创建并管理线程池。 2工作线程线程池中实际执行任务的线程。在初始化线程时会预先创建好固定数目的线程在池中这些初始化的线程一般处于空闲状态一般不占用CPU占用较小的内存空间。 3任务接口每个任务必须实现的接口当线程池的任务队列中有可执行任务时被空闲的工作线程调去执行线程的闲与忙是通过互斥量实现的跟前面文章中的设置标志位差不多把任务抽象出来形成接口可以做到线程池与具体的任务无关。 4任务队列用来存放没有处理的任务提供一种缓冲机制实现这种结构有好几种方法常用的是队列主要运用先进先出原理另外一种是链表之类的数据结构可以动态的为它分配内存空间应用中比较灵活下文中就是用到的链表。 下面的不在赘述百度《线程池技术在并发服务器中的应用》写的非常详细 转自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 ()函数用于销毁线程池线程池任务链表中的任务不会再被执行但是正在运行的线程会一直把任务运行完后再退出。[cpp] view plain copy #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);         //share resource   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/587735/

相关文章:

  • 网站反链接什么seo推广优化多少钱
  • 建设工程公司采购的网站找不到网站后台怎么办
  • 江门网站seo推广湖南省建设银行网站官网
  • 网站底部关键词指向网站打开速度慢跟什么有关系
  • 网站右侧广告合肥高端网站设计
  • 漯河市郾城区网站建设wordpress文件管理
  • 网站栅格大连做网站的
  • 珠海企业网站建设报价鄂州网吧什么时候恢复营业
  • 手机制作钓鱼网站id转换为wordpress
  • 手机网站 好处信用中国 网站有那个部门支持建设
  • 模板免费网站自己如何做网站优化
  • 自适应网站做mip改造淘宝上买衣服的网站
  • 射阳做企业网站哪家好利用新冠消灭老年人
  • 网站头部修改wordpress php幻灯片代码
  • 网络违法犯罪举报网站哪里有制作网站服务
  • 临沂怎么做网站网站 单页
  • 科技信息网站系统建设方案建筑设计专业世界大学排名
  • 做网站运营的简历小型视频网站建设
  • 福建省亿力电力建设有限公司网站网页设计html代码大全动物
  • 如何建网站赚取佣金企业网站的在线推广方法有
  • 嵌入式转行到网站开发免费秒玩小游戏
  • 采购网站排名不需要证件做网站
  • wordpress添加用户登录东莞网络公司seo优化
  • 哪些企业网站使用水墨风格设计免费
  • 河北邯郸做网站的公司哪家好云南建站公司
  • 网站开发如何给用户发邮件wordpress中文插件下载
  • 专业外贸网站建设公司排名网站错误列表
  • 魔站建站系统哪家好扬州网站开发公司电话
  • 合伙做网站网络公司网站建设首页
  • 网站建设项目经理深圳在线官网