【Linux】线程池(第十八篇)

目录

线程池的概念

线程池的基本组成

实现方式

1. 定义任务

2. 创建线程池

3. 初始化和销毁线程池

4. 添加任务

注意事项


线程池的概念

线程池(Thread Pool)是一种基于池化技术设计用于管理线程的资源池。它预先创建并维护多个线程,这些线程等待执行新的任务。当有新任务到来时,线程池会分配一个空闲的线程来执行该任务,而不是为每个任务都创建一个新的线程。这样做的好处包括减少线程的创建和销毁的开销(线程创建和销毁是昂贵的操作),提高资源利用率,以及更好地控制并发执行的线程数量,避免过多的线程导致系统资源耗尽。

线程池的基本概念包括:

  1. 核心线程数(Core Threads):线程池中始终保持活跃的线程数量。即使这些线程是空闲的,它们也不会被销毁,而是等待新的任务到来。

  2. 最大线程数(Maximum Threads):线程池中允许的最大线程数量。当任务队列满了,且已运行的线程数小于最大线程数时,线程池会创建新的线程来执行任务。

  3. 任务队列(Work Queue):用于存放待执行的任务。当所有核心线程都在忙时,新来的任务会被添加到任务队列中等待。队列的实现可以是阻塞队列,也可以是其他类型的队列。

  4. 线程工厂(Thread Factory):用于创建新线程的工厂,允许自定义线程的创建过程,比如设置线程的名称、优先级、守护状态等。

  5. 拒绝策略(Rejected Execution Handler):当任务队列已满,且线程池中的线程数量已达到最大线程数时,新来的任务无法被立即执行。此时,需要有一种策略来处理这些任务,比如直接抛出异常、放弃任务、尝试将任务放入一个等待队列中(这个队列与任务队列不同,它用于存放那些因为线程池容量限制而被拒绝的任务),或者由调用者所在的线程来执行这个任务。

  6. 生命周期管理:线程池需要能够管理自身的生命周期,包括启动、运行和关闭。在关闭过程中,线程池需要等待所有已提交的任务完成(或者等待一定的时间后强制终止未完成的任务),并释放所有占用的资源。

线程池的基本组成

一个基本的线程池通常包含以下几个部分:

  1. 线程池管理器:管理线程池,包括创建和销毁线程、任务分配等。
  2. 工作线程:线程池中真正执行任务的线程。
  3. 任务队列:用于存放待处理的任务。
  4. 任务接口:每个任务需要实现的接口,以便工作线程可以调用执行任务。

实现方式

在 Linux 下,有多种方式可以实现线程池,比如使用 POSIX 线程(pthread)库。下面提供一个简化的基于 pthread 的线程池实现思路:

1. 定义任务

首先,定义一个任务结构体和任务执行函数。

typedef struct task { 
void (*func)(void *arg); 
void *arg; 
struct task *next; 
} task_t; void task_execute(void *arg) { 
task_t *task = (task_t *)arg; 
task->func(task->arg); 
free(task); 
}

2. 创建线程池

实现一个线程池管理器,管理线程和任务队列。

#include <pthread.h> #include <stdlib.h> typedef struct { pthread_mutex_t lock; pthread_cond_t cond; pthread_t *threads; int num_threads; task_t *head; task_t *tail; int shutdown; } threadpool_t; void *thread_function(void *arg) { threadpool_t *pool = (threadpool_t *)arg; while (1) { pthread_mutex_lock(&pool->lock); // 等待任务 while (pool->head == NULL && !pool->shutdown) { pthread_cond_wait(&pool->cond, &pool->lock); } // 检查是否停止 if (pool->shutdown && pool->head == NULL) { pthread_mutex_unlock(&pool->lock); break; } // 取出任务 task_t *task = pool->head; pool->head = task->next; if (pool->head == NULL) { pool->tail = NULL; } pthread_mutex_unlock(&pool->lock); // 执行任务 if (task != NULL) { task_execute(task); } } return NULL; } // 初始化线程池... // 添加任务到线程池... // 销毁线程池...
3. 初始化和销毁线程池

初始化线程池时,你需要创建多个线程,并初始化互斥锁和条件变量。销毁时,需要设置关闭标志,并唤醒所有等待的线程,等待它们退出。

4. 添加任务

添加任务到线程池时,需要加锁保护任务队列,然后将任务添加到队列末尾,并唤醒一个等待的线程(如果有的话)。

注意事项

  • 同步和互斥:线程池中的任务添加、任务执行等操作需要同步和互斥机制来确保数据的一致性和线程安全。
  • 任务队列:任务队列可以基于链表、队列或其他数据结构实现,具体取决于任务类型和执行方式。
  • 错误处理:在实际应用中,需要考虑各种错误情况,如线程创建失败、任务执行出错等。

通过以上步骤,你可以实现一个基本的线程池来管理和执行并发任务。当然,实际应用中可能还需要考虑更多的细节和性能优化。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/145340.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

拥塞控制算法的 rtt 公平性

我强调过&#xff0c;拥塞控制的核心在公平可用性&#xff0c;公平性由 buffer 动力学保证&#xff0c;而 buffer 动力学有两种表现形式&#xff1a; buffer 占比决定带宽占比&#xff0c;以 aimd 为例&#xff1b;带宽越小&#xff0c;buffer 挤兑加速比越大&#xff0c;以 b…

AI Agent的20个趋势洞察

结论整理自【QuestMobile2024 AI智能体应用洞察半年报】&#xff1a; AI原生应用&#xff08;APP)一路高歌&#xff1b;豆包用户突破3000万&#xff1b;TOP10 APP以综合类应用为主。无论何种类型的AIGC APP都以智能体为“抓手”&#xff0c;专注于解决各种细分场景中的问题&am…

Opencv+Cuda编译的保姆级别教程

OpencvCuda编译的保姆级别教程 一、环境总览二、环境准备2.1 opencv和opencv扩展2.2 cuda环境下载2.2.1 首先电脑要有英伟达的显卡2.2.2 然后查看显卡驱动版本2.2.3 下载Cuda Toolkit工具包2.2.4 下载Cudnn库 2.3 CMake下载 三、CMake配置步骤3.1 加载路径第一次Configure3.1.1…

influxdb-winsdows电脑用户切换 Unauthorized

如果切换winsdows电脑用户之后启动influxdb出现Unauthorized 1.考虑windows用户的权限问题&#xff0c;给full control 2.要把原来用户下的.influxdb中的sqlite给搬到新用户下&#xff0c;因为里面存了数据库的token&#xff0c;需要认证

C++入门基础知识77(实例)——实例 2【标准输入输出】

成长路上不孤单&#x1f60a;&#x1f60a;&#x1f60a;&#x1f60a;&#x1f60a;&#x1f60a; 【14后&#x1f60a;///C爱好者&#x1f60a;///持续分享所学&#x1f60a;///如有需要欢迎收藏转发///&#x1f60a;】 今日分享关于C 实例 【标准输入输出】相关内容&#…

React学习day08-useReducer、useMemo、memo、useCallback、forwardRef、useInperativeHandle

15、useReducer 1&#xff09;作用&#xff1a;用来管理相对复杂的状态数据&#xff0c;类似于useState 2&#xff09;使用步骤&#xff08;传递一般的参数&#xff09;&#xff08;在APP.js中&#xff09;&#xff1a; ①定义一个reducer函数&#xff0c;在函数中通过switc…

技术美术百人计划 | 《4.4 抗锯齿》笔记

前言&#xff1a;文中补充的内容很多来自链接里的&#xff0c;建议看看链接的文章。 一、锯齿 (一) 什么是锯齿 在学习渲染的旅途中&#xff0c;你可能会时不时遇到模型边缘有锯齿的情况。这些锯齿边缘(Jagged Edges)的产生和光栅器将顶点数据转化为片段的方式有关。在下面的…

Mobile net V系列详解 理论+实战(1)

Mobilenet 系列 论文精讲部分0.摘要1. 引文2. 引文3. MobileNet 模型架构3.0 卷积个人理解3.1 深度可分离卷积3.2 网络结构和训练3.3 宽度乘数&#xff1a;更细的模型 α3.4 分辨率乘数&#xff1a;降低表示的维度ρ 4. 实验4.1 模型选择4.2. 模型缩减超参数4.3. 细粒度识别4.4…

人力资源数据集分析(二)_随机森林与逻辑回归

数据入口&#xff1a;人力资源分析数据集 - Heywhale.com 数据说明 字段说明EmpID唯一的员工IDAge年龄AgeGroup年龄组Attrition是否离职BusinessTravel出差&#xff1a;很少、频繁、不出差DailyRate日薪Department任职部门&#xff1a;研发部门、销售部门、人力资源部门Dista…

Linux 进程3

进程地址空间 CPU读取数据都需要地址&#xff0c;在计算机中所有东西都是一种数据&#xff0c;包括我们的进程。 这是一个进程空间示意图&#xff0c;操作系统通过task_struct结构体链表来管理每一个进程&#xff0c;结构体里面有一个指针指向操作系统为进程开辟的一段空间&am…

2-100 基于matlab的水果识别

基于matlab的水果识别。从面积特征、似圆形特征&#xff0c;颜色(rgb值和hsv值)特征对图像中的梨子、苹果、桃子、香蕉和菠萝进行特征提取&#xff0c;边缘检测识别&#xff0c;最后按照筛选出来的特征对水果进行识别。程序已调通&#xff0c;可直接运行。 下载源程序请点链接…

【CustomPainter】渐变圆环

说明 实现一个渐变圆环&#xff0c;起点位置为- π / 2。 效果 源码 GradientCircularPainter1 class GradientCircularPainter1 extends CustomPainter {final double progress;GradientCircularPainter1(this.progress);overridevoid paint(Canvas canvas, Size size) {c…

VCNet论文阅读笔记

VCNet论文阅读笔记 0、基本信息 信息细节英文题目VCNet and Functional Targeted Regularization For Learning Causal Effects of Continuous Treatments翻译VCNet和功能目标正则化用于学习连续处理的因果效应单位芝加哥大学年份2021论文链接[2103.07861] VCNet和功能定向正…

OpenCV特征检测(5)检测图像中的角点函数cornerMinEigenVal()的使用

操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 算法描述 计算用于角点检测的梯度矩阵的最小特征值。 该函数类似于 cornerEigenValsAndVecs&#xff0c;但它计算并存储协方差矩阵导数的最小特征值&…

2024上海工博会,正运动激光振镜运动控制器应用预览(二)

■展会名称&#xff1a; 第二十四届中国国际工业博览会&#xff08;以下简称“上海工博会”&#xff09; ■展会日期 2024年9月24日–28日 ■展馆地点 中国国家会展中心&#xff08;上海&#xff09; ■展位号 6.1H-E261 正运动激光加工控制解决方案主要分为激光振镜运动…

24 小时不关机的挂机云电脑,还能这么玩?

云电脑技术为我们提供了无限可能。特别是对于游戏爱好者&#xff0c;挂机云电脑不仅解决了传统电脑的局限性&#xff0c;还带来了更为便利的游戏体验。除此之外云电脑还有什么其他玩法呢&#xff1f; 01 挂机云电脑的优势 首先要知道&#xff0c;什么是挂机云电脑&#xff1f…

解锁自动化新境界:KeymouseGo,让键盘和鼠标动起来!

文章目录 解锁自动化新境界&#xff1a;KeymouseGo&#xff0c;让键盘和鼠标动起来&#xff01;背景&#xff1a;为何选择KeymouseGo&#xff1f;KeymouseGo简介安装KeymouseGo简单函数使用应用场景常见问题与解决方案总结 解锁自动化新境界&#xff1a;KeymouseGo&#xff0c;…

操作系统 | 学习笔记 | | 王道 | 5.1 I/O管理概述

5.1 I/O管理概述 5.1.1 I/O设备 注&#xff1a;块设备可以寻址&#xff0c;但是字符设备是不可寻址的 I/O设备是将数据输入到计算机中&#xff0c;或者可以接收计算机输出数据的外部设备&#xff0c;属于计算机中的硬件部件&#xff1b; 设备的分类 按使用特性分类&#xff…

from tqdm.auto import tqdm用法详细介绍

tqdm 是一个 Python 库&#xff0c;用于在长时间运行的任务中显示进度条。tqdm.auto 是 tqdm 的一个版本&#xff0c;能够自动适配输出环境&#xff08;如 Jupyter Notebook、命令行等&#xff09;&#xff0c;以确保进度条在各种环境下显示正确。下面是 tqdm.auto 的详细用法介…

英飞凌 PSoC6 评估板 RT-Thread 开发环境搭建

本文介绍如何搭建基于 RT-Thread Studio IDE 工具的 PSoC6 RTT 评估板的开发环境&#xff0c;通过搭建一个简单的工程&#xff0c;将代码编译、下载到 PSoC6 RTT 开发板。 安装软件包 首先需要安装 RT-Thread Studio&#xff0c;如果你还没安装&#xff0c;可以点击这里下载安…