C语言线程池原理介绍

为什么要用线程池?

多线程适用于小型的局域网络中,但在大型的局域网或者互联网的规模下,线程的创建和销毁,都涉及到系统调用,比较消耗系统资源,所以就引入了线程池技术,避免频繁的线程创建和销毁。

 

线程池是一个抽象的概念,一般小型项目用不到,我也只能算是了解的水平,所以尽我所能的用一个简单的方式描述,懂得原理,真实使用的时候也就方便多了,开始了……

 

线程池里有一些空的线程,这个数量是有限的,它的数量由创建时设定。其中的线程可以循环利用,不需要重复的创建与销毁。

把线程池比作一个加工厂,要运行的代码比作原材料,CPU是加工原料的机器,里边的这些线程比作运输材料的卡车,当然还有一个存放原材料的仓库(任务队列)。 

我们的目的,是要将原料通过加工厂加工(执行程序)。

首先将原材料,按顺序放入仓库中,我们卡车,从仓库取出原材料,运送到加工机里。

卡车是数量是固定的,加工的机器数量也是固定的。

启动多少台卡车工作要根据仓库中的原材料的多少。

卡车的状态,正在工作的卡车,等待装车的卡车,等待熄火的卡车,还有没有发动的卡车。

仓库的容量有限,当仓库堆满后,在里边有空间之前,其他的原材料不可以再进来了。(进行阻塞)

仓库中的原材料会按照先进先加工的规则进行。

当仓库里的材料加工没了,停在仓库门口,等待装在原材料的卡车还在待命,这也是不行的,需要让他们"熄火",只留下个别“待命”(也要进行一个阻塞)

 

系统性介绍线程池(含代码)的博客传送门

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
线程池是一种用于管理和复用线程的机制,它可以提高多线程程序的性能和可扩展性。线程池中包含一组预先创建的线程,这些线程可以处理任务队列中的任务,而不需要每次都创建和销毁线程。 线程池原理如下: 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秒钟,以确保所有任务都被执行完毕。 请注意,这只是一个简单示例,实际上线程池的实现可能需要更多的细节和线程安全机制。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值