加入收藏 | 设为首页 | 会员中心 | 我要投稿 我爱制作网_沈阳站长网 (https://www.024zz.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 服务器 > 搭建环境 > Linux > 正文

Linux 线程池 C 实现.doc

发布时间:2022-11-11 12:50:19 所属栏目:Linux 来源:
导读:  什么时候需要创建线程池呢?简单的说,如果一个应用需要频繁的创建和销毁线程,而任务执行的时间又非常短,这样线程创建和销毁的带来的开销就不容忽视,这时也是线程池该出场的机会了。如果线程创建和销毁时间相比任务
  什么时候需要创建线程池呢?简单的说,如果一个应用需要频繁的创建和销毁线程,而任务执行的时间又非常短,这样线程创建和销毁的带来的开销就不容忽视,这时也是线程池该出场的机会了。如果线程创建和销毁时间相比任务执行时间可以忽略不计,则没有必要使用线程池了。
 
  下面是Linux系统下用C语言创建的一个线程池。线程池会维护一个任务链表(每个CThread_worker结构就是一个任务)。
 
  pool_init()函数预先创建好max_thread_num个线程,每个线程执thread_routine ()函数。该函数中
 
  while (pool->cur_queue_size == 0)
 
  {
 
  pthread_cond_wait (&(pool->queue_ready)线程池linux,&(pool->queue_lock));
 
  }
 
  表示如果任务链表中没有任务,则该线程出于阻塞等待状态。否则从队列中取出任务并执行。
 
  pool_add_worker()函数向线程池的任务链表中加入一个任务,加入后通过调用pthread_cond_signal (&(pool->queue_ready))唤醒一个出于阻塞状态的线程(如果有的话)。
 
  pool_destroy ()函数用于销毁线程池,线程池任务链表中的任务不会再被执行,但是正在运行的线程会一直把任务运行完后再退出。
 
  下面贴出完整代码
 
  #include
 
  #include
 
  #include
 
  #include
 
  #include
 
  #include
 
  /*
 
  *线程池里所有运行和等待的任务都是一个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 po
 

(编辑:我爱制作网_沈阳站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!