1. 线程池基础概念与设计思路
线程池本质上是一种生产者-消费者模型的变体实现。想象一个快递仓库:快递员(线程)固定有5个人,每天待命(阻塞等待),当有包裹(任务)到达时,立即分配一个空闲快递员处理,而不是临时招聘新人。这种模式避免了频繁创建销毁线程的系统开销。
在Linux环境下,线程创建成本约为8MB栈空间分配+2ms上下文切换时间。当QPS达到1000时,传统每请求每线程模式将导致内存爆炸和调度抖动。而线程池通过复用固定数量的工作线程,将资源消耗控制在稳定水平。
典型线程池包含四个核心组件:
- 任务队列:环形缓冲区存储待执行函数指针和参数
- 工作线程组:pthread_t数组维护的线程集合
- 同步原语:互斥锁+条件变量实现任务调度
- 管理接口:初始化、添加任务、销毁等方法
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 关键数据结构实现
2.1 任务队列设计
采用链表实现动态扩容的任务队列:
c复制typedef struct Task {
void (*function)(void *);
void *arg;
struct Task *next;
} Task;
typedef struct {
Task *head;
Task *tail;
int size;
} TaskQueue;
注意:链表实现相比数组避免了固定大小限制,但每次操作需要额外内存分配。生产环境建议使用ring buffer+atomic计数组合
2.2 线程池控制块
c复制typedef struct {
pthread_t *threads;
int thread_count;
TaskQueue queue;
pthread_mutex_t lock;
pthread_cond_t notify;
int shutdown;
} ThreadPool;
关键参数说明:
thread_count:建议设置为CPU核心数×2+1(I/O密集型场景)shutdown:优雅退出标志位,避免强制终止导致任务丢失
3. 核心函数实现细节
3.1 工作线程主循环
c复制static void *thread_work
