线程池相关
线程池
线程池的执行顺序是无序的,即从任务队列中取出来任务,但是这个的执行顺序是无法保证这些线程是顺序的;
整个线程池就是基于线程的封装,并抽象两个接口,一个是任务队列,一个是工作线程队列;用到线程池的向任务队列添加任务,并调用一个接口(任务结构中定义),参数的话通过一个void指针进行传递;然后工作队列在任务队列中有任务的时候就不断提取进行程序执行;这个添加与提取的过程就涉及到了临界区,因此需要mutex来进行保护;
任务中的指针空间释放的话一般放在任务函数中,要确定好责任归属,资源是谁申请的就要由谁来进行释放;
线程池的作用
- 减少线程创建销毁:不用在需要线程的时候动态创建,线程是一直存在的,只不过在没有任务队列的时候处于条件等待状态;
- 异步解耦的作用:即将需要异步的执行操作通过一个接口丢在线程池中即可;
线程池接口
- 线程池创建
- 线程池添加任务
- 线程池销毁
线程池的控制
- pthread_mutex_t
首先就是线程池针对任务队列的锁,用于保护任务队列这个临界区资源;pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER; pthread_mutex_lock(&mutex); pthread_mutex_unlock(&mutex);
- pthread_cond_t
然后就是条件变量,在线程池运行过程中,很容易遇到一种情况就是任务队列中没有任务,此时有两种方案,一种是轮询任务队列,这个就是在浪费CPU的资源;另外一种方式就是使用条件变量pthread_cond_t cond = PTHREAD_COND_INITIALIZER; pthread_cond_wait(&cond); pthread_cond_signal(&cond); -- 对等待条件变量的线程中的一个进行唤醒 pthread_cond_broadcast(&cond); -- 对全部等待条件变量的线程进行唤醒
线程ID
pthread_self返回的ID不是tid,他仅在进程范围中有效,tid需要使用syscall(SYS_gettid)来获取;tid就是LWP,主线程的LWP和pid相同,副线程的LWP和pid不相同;
抽象的粒度
计算机的核心就是模块化,不断的进行问题抽象,然后以函数的形式进行实现;
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
· 25岁的心里话