C 线程池创建

最近学了些网络编程的知识,想要用epoll和多线程尝试搭建一个简单的后台服务程序。epoll负责监听所有连接发生的事件,然后再用一个新的线程来处理这个事件(读取socket并处理)。这样子可以使得事件能够及时处理,epoll也不会阻塞在socketIO上。

使用线程池原因

因为要处理的事件花费的CPU时间很少,而且因为连接多,处理的事件很多,所以频繁创建线程不是一种明智的做法,这样子会把大部分时间花在线程的创建上。因此,通过创建一个线程池,在应用开始前就指定创建的线程数目,然后将线程阻塞(阻塞是不会浪费CPU时间的),一旦有连接需要处理时,就让线程池中的线程进行处理。

代码解析

在网上找到一份用C实现的代码:简单Linux C线程池 觉得写得挺不错的,就用它的这份小小修改了一下而已。

主要的函数有如下几个:

int threadpool_add_job(struct threadpool pool, void (*callback_function)(void *arg), void *arg);

这个函数是将一个需要线程执行的函数传入线程池的等待队列中,如果队列满的话就等待队列有空位再加入(队列太长占用的空间也会更大)如果队列为空的话会通过一个条件变量通知线程(停止阻塞)。

void* threadpool_function(void* arg)

这是线程执行的函数,如果队列为空则阻塞,否则取出一个进行执行。执行完要检查是否改变条件变量的值(队列是否变成非满,变成空了)

int threadpool_destroy(struct threadpool *pool)

等待线程都执行完毕后,回收资源

条件变量

这里还涉及到一个条件变量:Linux多线程编程详细解析—-条件变量 pthread_cond_t

    pthread_mutex_lock(&(pool->mutex));
    while ((pool->queue_cur_num == pool->queue_max_num) && !(pool->queue_close || pool->pool_close))
    {
        pthread_cond_wait(&(pool->queue_not_full), &(pool->mutex));   //队列满的时候就等待
    }

一般的使用场景如上,先获得一个锁,然后用一个循环包住条件变量,pthread_cond_wait的作用是释放锁,然后阻塞在条件变量,一直等到条件变量改变则唤醒线程,然后重新获得锁,接着检查循环语句是否为真。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值