线程池和进程池是什么?解释概念之后并用c语言实现一个简单的线程池和进程池
时间: 2023-06-28 16:15:32 浏览: 105
六、进程池与线程池学习ppt
线程池和进程池都是一种资源池,用于管理和复用多个线程或进程,以提高程序的性能和效率。
线程池:线程池是一组预先创建好的线程,它们可以被重复使用来处理多个任务。线程池可以减少线程创建和销毁的开销,同时也可以控制线程的数量,避免线程过多导致的性能问题。线程池一般包括一个任务队列和多个工作线程,任务队列用于存放需要执行的任务,而工作线程则用于执行任务。当有任务需要执行时,线程池会从任务队列中获取一个任务分配给一个空闲的工作线程来执行。
进程池:进程池是一组预先创建好的进程,它们可以被重复使用来处理多个任务。进程池可以减少进程创建和销毁的开销,同时也可以控制进程的数量,避免进程过多导致的性能问题。进程池一般包括一个任务队列和多个工作进程,任务队列用于存放需要执行的任务,而工作进程则用于执行任务。当有任务需要执行时,进程池会从任务队列中获取一个任务分配给一个空闲的工作进程来执行。
下面是一个简单的使用C语言实现的线程池示例代码:
```c
#include <pthread.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#define MAX_THREADS 10
#define MAX_TASKS 20
typedef struct {
void (*task)(void *);
void *arg;
} task_t;
typedef struct {
int count;
int head;
int tail;
pthread_mutex_t lock;
pthread_cond_t notify;
task_t tasks[MAX_TASKS];
} task_queue_t;
typedef struct {
pthread_t thread;
task_queue_t *queue;
} worker_t;
typedef struct {
int count;
worker_t workers[MAX_THREADS];
} thread_pool_t;
void task_queue_init(task_queue_t *queue) {
queue->count = 0;
queue->head = 0;
queue->tail = 0;
pthread_mutex_init(&queue->lock, NULL);
pthread_cond_init(&queue->notify, NULL);
}
void task_queue_push(task_queue_t *queue, task_t task) {
pthread_mutex_lock(&queue->lock);
while (queue->count == MAX_TASKS) {
pthread_cond_wait(&queue->notify, &queue->lock);
}
queue->tasks[queue->tail] = task;
queue->tail = (queue->tail + 1) % MAX_TASKS;
queue->count++;
pthread_cond_signal(&queue->notify);
pthread_mutex_unlock(&queue->lock);
}
task_t task_queue_pop(task_queue_t *queue) {
pthread_mutex_lock(&queue->lock);
while (queue->count == 0) {
pthread_cond_wait(&queue->notify, &queue->lock);
}
task_t task = queue->tasks[queue->head];
queue->head = (queue->head + 1) % MAX_TASKS;
queue->count--;
pthread_cond_signal(&queue->notify);
pthread_mutex_unlock(&queue->lock);
return task;
}
void *worker_thread(void *arg) {
worker_t *worker = (worker_t *)arg;
task_queue_t *queue = worker->queue;
while (1) {
task_t task = task_queue_pop(queue);
task.task(task.arg);
}
return NULL;
}
void thread_pool_init(thread_pool_t *pool) {
pool->count = 0;
}
void thread_pool_add_worker(thread_pool_t *pool, task_queue_t *queue) {
worker_t *worker = &pool->workers[pool->count++];
worker->queue = queue;
pthread_create(&worker->thread, NULL, worker_thread, worker);
}
void thread_pool_submit_task(thread_pool_t *pool, task_t task) {
task_queue_push(&pool->workers[0].queue, task);
}
void print_task(void *arg) {
int *value = (int *)arg;
printf("Task: %d\n", *value);
sleep(1);
}
int main() {
thread_pool_t pool;
task_queue_t queue;
task_queue_init(&queue);
thread_pool_init(&pool);
thread_pool_add_worker(&pool, &queue);
int i;
for (i = 0; i < 20; i++) {
int *value = malloc(sizeof(int));
*value = i;
task_t task = {print_task, value};
thread_pool_submit_task(&pool, task);
}
pthread_exit(NULL);
return 0;
}
```
这个例子中,我们使用了一个任务队列来存放需要执行的任务,然后使用线程池来管理多个工作线程,执行任务。在主函数中,我们创建了20个任务,然后将它们提交给线程池来执行。在任务函数中,我们简单地打印出任务的编号并休眠一秒钟,模拟任务的执行过程。
阅读全文