pool函数C语言,C语言实现线程池

本文介绍了在Linux环境下使用C语言实现线程池的方法,包括pool_init()、pool_add_worker()和pool_destroy()函数的详细说明。线程池通过维护任务链表,有效减少了频繁创建和销毁线程的开销,适用于任务执行时间短且创建频繁的情况。示例代码展示了线程池如何调度和执行任务。
摘要由CSDN通过智能技术生成

https://www.jianshu.com/p/6afdffe94d96

什么时候需要创建线程池呢?简单的说,如果一个应用需要频繁的创建和销毁线程,而任务执行的时间又非常短,这样线程创建和销毁的带来的开销就不容忽视,这时也是线程池该出场的机会了。如果线程创建T1和销毁时间T3相比任务执行时间T2可以忽略不计,则没有必要使用线程池了。反之如果T1+T3>T2,那就很有必要使用线程池。

下面是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

#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_po

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值