C语言实现的简单线程池:基于pthread的轻量型Threadpool设计

news/2024/11/13 3:47:39/

目录

线程池(Threadpool)是什么?

pthread库是什么?

如何在C语言中实现基于pthread的轻量型线程池?


你好,各位编程爱好者!今天,我将和大家分享一种在C语言中实现的简单线程池设计方法。这种设计方法基于pthread库,所以我们称之为“基于pthread的轻量型Threadpool设计”。

源码下载

线程池(Threadpool)是什么?

在介绍线程池设计之前,我们先要理解什么是线程池。

线程池,顾名思义,就是预先创建一组线程,放在一起,构成一个“池子”。当有新的任务到来时,就从这个池子中取出一个线程去执行任务,执行完成后,线程返回线程池,等待执行下一个任务。

线程池可以帮助我们减少线程生命周期的开销,提高系统的响应速度,提高线程的可管理性,并且可以限制系统中的线程数量,防止系统资源过度消耗。

pthread库是什么?

pthread库是POSIX标准定义的线程库,它在UNIX-like系统,比如Linux,BSD等中广泛应用。pthread库提供了一系列的API,使得我们在C语言中可以创建、控制和销毁线程。

如何在C语言中实现基于pthread的轻量型线程池?

首先,我们需要定义线程池的数据结构。线程池中包含了一组线程,以及一个任务队列:

typedef struct {pthread_mutex_t lock;pthread_cond_t notify;pthread_t *threads;struct task {void (*function)(void *);void *argument;struct task *next;} *taskQueue;int threadCount;int taskQueueSize;
} ThreadPool;

然后,我们需要实现线程池的创建、销毁和添加任务的函数。

创建线程池:

ThreadPool *threadpool_create(int threadCount) {// 检查线程数是否有效if(threadCount <= 0) {return NULL;}// 创建线程池ThreadPool *pool = malloc(sizeof(ThreadPool));if(pool == NULL) {return NULL;}// 初始化线程池pool->threadCount = threadCount;pool->taskQueue = NULL;pthread_mutex_init(&(pool->lock), NULL);pthread_cond_init(&(pool->notify), NULL);// 创建线程pool->threads = malloc(sizeof(pthread_t) * threadCount);for(int i=0; i<threadCount; i++) {pthread_create(&(pool->threads[i]), NULL, threadpool_thread, pool);}return pool;
}

这只是一种简化的线程池设计方法,适合用来学习和理解线程池的基本概念和原理。在实际项目中,线程池的设计和实现会更复杂,需要考虑更多的因素,比如任务的优先级

首先是线程工作的函数:

void *threadpool_thread(void *threadpool) {ThreadPool *pool = (ThreadPool *)threadpool;struct task *task;for(;;) {// 等待可用任务pthread_mutex_lock(&(pool->lock));while(pool->taskQueue == NULL) {pthread_cond_wait(&(pool->notify), &(pool->lock));}// 取出一个任务task = pool->taskQueue;pool->taskQueue = task->next;pthread_mutex_unlock(&(pool->lock));// 执行任务(*(task->function))(task->argument);// 释放任务free(task);}pthread_exit(NULL);return(NULL);
}

添加任务到线程池中:

int threadpool_add(ThreadPool *pool, void (*function)(void *), void *argument) {// 创建任务struct task *newTask = malloc(sizeof(struct task));if(newTask == NULL) {return -1;}newTask->function = function;newTask->argument = argument;newTask->next = NULL;// 添加任务到任务队列pthread_mutex_lock(&(pool->lock));if(pool->taskQueue == NULL) {pool->taskQueue = newTask;} else {struct task *tmp = pool->taskQueue;while(tmp->next) {tmp = tmp->next;}tmp->next = newTask;}pthread_cond_signal(&(pool->notify));pthread_mutex_unlock(&(pool->lock));return 0;
}

销毁线程池:

void threadpool_destroy(ThreadPool *pool) {// 通知所有线程退出pthread_mutex_lock(&(pool->lock));for(int i=0; i<pool->threadCount; i++) {pthread_cancel(pool->threads[i]);}pthread_mutex_unlock(&(pool->lock));// 释放线程资源for(int i=0; i<pool->threadCount; i++) {pthread_join(pool->threads[i], NULL);}// 释放线程池资源free(pool->threads);free(pool);
}

在这个简单的线程池中,我们只提供了最基本的线程池功能。例如,我们没有提供动态调整线程数量的功能,也没有处理任务队列满的情况。在真实环境中,这些功能可能是必要的。

这个简单的线程池实现可以帮助你理解线程池的基本概念。在实际使用中,你可能需要使用更复杂的线程池库,例如libuv或者Boost.Asio等。

感谢你的阅读,希望这篇文章对你有所帮助。如果你有任何问题或者建议,欢迎留言讨论。


http://www.ppmy.cn/news/73666.html

相关文章

失业五个月,终于有offer了!但这家公司的风评惨不忍睹,要接吗?

往年&#xff0c;程序员们找工作可以说是不怎么费力的&#xff0c;不少求职者还会比对几家offer&#xff0c;看薪酬、看加不加班、看通勤时间等等等等&#xff0c;最后选择自己最满意的那一家过去。 但是今年&#xff0c;情况确实完全不一样&#xff0c;用网友的话形容就是“往…

Flutter 笔记 | Flutter 核心原理(一)架构和生命周期

Flutter 架构 简单来讲&#xff0c;Flutter 从上到下可以分为三层&#xff1a;框架层、引擎层和嵌入层&#xff0c;下面我们分别介绍&#xff1a; 1. 框架层 Flutter Framework&#xff0c;即框架层。这是一个纯 Dart实现的 SDK&#xff0c;它实现了一套基础库&#xff0c;自…

探索Vue的组件世界-实现Vue插件

一个好的框架满足几大设计原则&#xff1a; 开闭原则&#xff1a;对修改源码关闭&#xff0c;对功能扩展开放 vue作为一个优秀的组件框架&#xff1a;满足开闭原则&#xff0c;提供良好的插件机制&#xff0c;以提供三方来扩展功能 Mixin模式 Vue.mixin(mixin) 全局注册的m…

安装Ubuntu18.04双系统、干净卸载,并在Ubuntu系统中安装CARLA模拟器

Ubuntu系统安装 Ubuntu系统安装参照流程 Ubuntu 双系统安装流程_ubuntu双系统_地球被支点撬走啦的博客-CSDN博客 Ubuntu系统卸载 1.将开机启动项设置默认为Windows&#xff0c;进入BIOS设置界面调整BootDevice中Windows和Ubuntu的顺序&#xff0c;将Windows调整在Ubuntu前边…

CMD与DOS脚本编程【第八章】

预计更新 第一章. 简介和基础命令 1.1 介绍cmd/dos脚本语言的概念和基本语法 1.2 讲解常用的基础命令和参数&#xff0c;如echo、dir、cd等 第二章. 变量和运算符 2.1 讲解变量和常量的定义和使用方法 2.2 介绍不同类型的运算符和运算规则 第三章. 控制流程和条件语句 3.1 介…

C语言函数详解

目录 一、函数的介绍 二、函数的分类 1.库函数 2.自定义函数 三、函数的参数 四、函数传参 1.传值调用 2.传址调用 五、函数的嵌套 六、函数的链式访问 七、函数声明 八、函数递归 不要回头&#xff0c;你要变得比现在更加强大 本专栏适用于有一定C语言基础并且还…

Linux—网络基础

目录 计算机网络背景 网络发展 认识 "协议" 网络协议初识 协议分层 OSI七层模型 TCP/IP五层(或四层)模型 网络传输基本流程 协议报头 局域网通信 网络传输流程图 局域网通信图 跨网络通信图 数据包封装和分用 网络中的地址管理 认识IP地址 认识MAC地址…

在Vue 3中使用useStorage轻松实现localStorage功能

在Vue 3中使用useStorage轻松实现localStorage功能 VueUse 介绍 VueUse文档&#xff1a;Get Started | VueUse VueUse是基于Vue3的Composition API的实用函数的集合&#xff0c;useStorage是其中的一个函数。我们可以使用useStorage来实现我们的localStorage功能。 安装 n…