线程池原理及C语言实现线程池
时间: 2023-08-31 17:07:57 浏览: 127
线程池 threadPool c语言实现
线程池是一种用于管理和复用线程的机制,它可以提高多线程程序的性能和可扩展性。线程池中包含一组预先创建的线程,这些线程可以处理任务队列中的任务,而不需要每次都创建和销毁线程。
线程池的原理如下:
1. 创建线程池:首先,创建一个包含固定数量的线程的线程池。这些线程处于空闲状态,等待任务的到来。
2. 提交任务:当有任务需要执行时,将任务提交到线程池。
3. 任务队列:线程池中有一个任务队列,用于存储待执行的任务。当有任务提交时,将任务放入队列中。
4. 任务调度:线程池中的空闲线程会从任务队列中获取任务进行执行。线程会不断地从任务队列中获取任务,直到队列为空。
5. 执行任务:线程从任务队列中获取任务后,执行该任务。
6. 线程复用:当一个线程完成了一个任务后,它会再次进入空闲状态,等待下一个任务的到来。这样可以避免频繁地创建和销毁线程,提高了性能和效率。
下面是一个简单的C语言实现线程池的示例代码:
```c
#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
#define THREAD_POOL_SIZE 5
typedef struct {
void (*task)(void *);
void *arg;
} Task;
typedef struct {
pthread_t thread;
int is_working;
} Worker;
Task task_queue[THREAD_POOL_SIZE];
Worker workers[THREAD_POOL_SIZE];
pthread_mutex_t mutex;
pthread_cond_t cond;
void *worker_thread(void *arg) {
while (1) {
pthread_mutex_lock(&mutex);
// 等待任务到来
while (task_queue[*(int *)arg].task == NULL) {
pthread_cond_wait(&cond, &mutex);
}
// 执行任务
Task task = task_queue[*(int *)arg];
task.task(task.arg);
// 清空任务
task_queue[*(int *)arg].task = NULL;
pthread_mutex_unlock(&mutex);
}
}
void thread_pool_init() {
int i;
pthread_mutex_init(&mutex, NULL);
pthread_cond_init(&cond, NULL);
for (i = 0; i < THREAD_POOL_SIZE; i++) {
workers[i].is_working = 0;
task_queue[i].task = NULL;
pthread_create(&workers[i].thread, NULL, worker_thread, &i);
}
}
void thread_pool_submit(void (*task)(void *), void *arg) {
pthread_mutex_lock(&mutex);
// 查找空闲线程
int i;
for (i = 0; i < THREAD_POOL_SIZE; i++) {
if (task_queue[i].task == NULL) {
task_queue[i].task = task;
task_queue[i].arg = arg;
pthread_cond_signal(&cond);
break;
}
}
pthread_mutex_unlock(&mutex);
}
void my_task(void *arg) {
int id = *(int *)arg;
printf("Task executed by thread %d\n", id);
}
int main() {
int i;
thread_pool_init();
// 提交任务
for (i = 0; i < 10; i++) {
int *arg = malloc(sizeof(int));
*arg = i;
thread_pool_submit(my_task, arg);
}
// 等待任务完成
sleep(1);
return 0;
}
```
这是一个简单的线程池实现。在主函数中,我们初始化了线程池,然后提交了10个任务。每个任务都打印出当前执行任务的线程ID。最后,我们等待1秒钟,以确保所有任务都被执行完毕。
请注意,这只是一个简单示例,实际上线程池的实现可能需要更多的细节和线程安全机制。
阅读全文