pthread_t线程池,线程池的运行机制,举个线程池的例子
时间: 2023-10-20 15:59:43 浏览: 90
pthread_t线程池是一种基于pthread库的线程池实现。线程池是一种用于管理和复用线程的机制,它可以提高多线程应用程序的性能和效率。
线程池的运行机制如下:
1. 初始化线程池:创建一定数量的线程,并将它们置于等待状态,等待任务的到来。
2. 提交任务:当有任务到达时,将任务添加到线程池的任务队列中。
3. 选择空闲线程:线程池会选择一个空闲的线程来执行任务,或者创建一个新的线程来执行任务。
4. 执行任务:选中的线程从任务队列中获取任务,执行任务的代码逻辑。
5. 回收线程:当任务执行完毕后,线程不会立即退出,而是继续等待新的任务到来。这样可以避免频繁创建和销毁线程的开销。
6. 销毁线程池:当不再需要线程池时,可以销毁线程池,释放资源。
下面是一个简单的pthread_t线程池的例子:
```c++
#include <pthread.h>
#include <stdio.h>
#include <stdlib.h>
#define THREAD_POOL_SIZE 5
#define TASK_QUEUE_SIZE 10
typedef struct {
int id;
// 其他需要传递给任务的参数
} Task;
void* task_func(void* arg) {
Task* task = (Task*)arg;
printf("Task %d is running\n", task->id);
// 执行任务的逻辑
free(task);
return NULL;
}
pthread_t thread_pool[THREAD_POOL_SIZE];
pthread_mutex_t task_queue_mutex = PTHREAD_MUTEX_INITIALIZER;
pthread_cond_t task_queue_cond = PTHREAD_COND_INITIALIZER;
Task* task_queue[TASK_QUEUE_SIZE];
int task_queue_size = 0;
int task_queue_front = 0;
int task_queue_rear = 0;
void* thread_func(void* arg) {
while (1) {
pthread_mutex_lock(&task_queue_mutex);
while (task_queue_size == 0) {
pthread_cond_wait(&task_queue_cond, &task_queue_mutex);
}
Task* task = task_queue[task_queue_front];
task_queue_front = (task_queue_front + 1) % TASK_QUEUE_SIZE;
task_queue_size--;
pthread_mutex_unlock(&task_queue_mutex);
task_func(task);
}
return NULL;
}
void thread_pool_init() {
int i;
for (i = 0; i < THREAD_POOL_SIZE; i++) {
pthread_create(&thread_pool[i], NULL, thread_func, NULL);
}
}
void thread_pool_destroy() {
int i;
for (i = 0; i < THREAD_POOL_SIZE; i++) {
pthread_cancel(thread_pool[i]);
}
}
void submit_task(Task* task) {
pthread_mutex_lock(&task_queue_mutex);
while (task_queue_size == TASK_QUEUE_SIZE) {
pthread_cond_wait(&task_queue_cond, &task_queue_mutex);
}
task_queue[task_queue_rear] = task;
task_queue_rear = (task_queue_rear + 1) % TASK_QUEUE_SIZE;
task_queue_size++;
pthread_cond_signal(&task_queue_cond);
pthread_mutex_unlock(&task_queue_mutex);
}
int main() {
thread_pool_init();
int i;
for (i = 0; i < 20; i++) {
Task* task = (Task*)malloc(sizeof(Task));
task->id = i;
submit_task(task);
}
sleep(5);
thread_pool_destroy();
return 0;
}
```
在上面的例子中,我们创建了一个包含5个线程的线程池。通过调用`submit_task`函数来提交任务,任务将被添加到任务队列中,并由空闲线程来执行。通过`thread_pool_init`函数初始化线程池,`thread_pool_destroy`函数销毁线程池。在主函数中,我们提交了20个任务给线程池,并等待5秒钟,然后销毁线程池。每个任务输出一个简单的信息,表示任务的执行。
阅读全文