1. 线程池基础概念与价值
线程池是一种并发编程中常用的设计模式,它的核心思想是预先创建一组线程并维护一个任务队列。当有新的任务到来时,线程池会从队列中取出任务分配给空闲线程执行,而不是为每个任务临时创建新线程。
注意:在多线程编程中,频繁创建和销毁线程会导致显著的性能开销。根据测试数据,线程创建和销毁的开销大约是执行一个简单任务的5-10倍。
线程池的主要优势体现在三个方面:
- 性能提升:避免了线程频繁创建销毁的系统调用开销
- 资源控制:可以限制并发线程数量,防止系统资源耗尽
- 任务管理:统一的任务队列提供了有序的执行环境
在实际应用中,线程池常见于以下场景:
- Web服务器处理并发请求
- 数据库连接池管理
- 批量数据处理任务
- 异步日志系统
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. POSIX线程基础API解析
2.1 线程生命周期管理
c复制int pthread_create(pthread_t *thread, const pthread_attr_t *attr,
void *(*start_routine)(void *), void *arg);
这个函数是线程创建的核心接口,参数解析:
thread:输出参数,返回线程标识符attr:线程属性,NULL表示默认属性start_routine:线程入口函数arg:传递给入口函数的参数
线程终止有两种方式:
- 主动调用
pthread_exit - 从入口函数返回
重要提示:主线程退出不会自动终止子线程,必须显式管理线程生命周期。
2.2 线程同步机制
互斥锁(Mutex)是线程同步的基础工具:
c复制pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
// 或者动态初始化
pthread_mutex_init(&mutex, NULL);
条件变量(Condition Variable)用于线程间通信:
c复制pthread_cond_t cond = PTHREAD_COND_INITIALIZER;
// 典型使用模式
pthread_mutex_lock(&mutex);
while(condition_is_false) {
pthread_cond_wait(&cond, &mutex);
}
// 处理条件满足的情况
pthread_mutex_unlock(&mutex);
3. 线程池核心实现
3.1 数据结构设计
线程池的核心数据结构包括:
c复制typedef struct Task {
void (*func)(void *); // 任务函数指针
void *arg; // 函数参数
struct Task *next; // 下一个任务
} Task;
typedef struct ThreadPool {
Task *task_queue; // 任务队列头指针
pthread_mutex_t mutex; // 保护任务队列的互斥锁
pthread_cond_t cond; // 任务通知条件变量
pthread_t *threads; // 线程数组
int thread_num; // 线程数量
int quit; // 退出标志
} ThreadPool;
3.2 线程工作函数
工作线程的核心
