计算机网络与多线程同步机制详解
一、IP地址与子网划分
在互联网世界中,IP地址就像是每个设备的"门牌号",它使得数据包能够准确送达目的地。IP地址的划分与管理就像城市的规划,通过合理的子网划分,能够高效地管理网络资源。
子网掩码的工作原理
子网掩码用于区分IP地址中的网络部分和主机部分。举个生活中的例子:
想象一个大型小区,小区地址是"海淀区中关村大街123号"(网络地址),而具体到每个住户还需要楼号和门牌号(主机地址)。子网掩码就像是告诉邮递员:"这个地址的前几部分是小区的公共地址,后面的部分才是具体住户"。
IP地址: 192.168.1.34子网掩码: 255.255.255.0 (或表示为/24)
在这个例子中,前24位(192.168.1)标识网络,最后8位(34)标识具体主机,就像是"A小区B栋34号"。
IP地址的分类
传统IP地址分为A、B、C、D、E五类,每类地址用于不同规模的网络:
- A类:适合超大型网络,如大型跨国企业的内部网络
- B类:适合中型网络,如区域性企业或大学校园网
- C类:适合小型网络,如小型办公室或家庭网络
- D类:用于多播
- E类:保留作研究用途
二、多线程编程中的同步机制
在多线程编程中,不同线程之间共享资源的访问需要协调,就像多个人需要共用一个厨房或洗手间一样,需要有一套"规矩"来避免冲突。
临界区问题
临界区是指多个线程都需要访问的共享资源。想象一个办公室只有一台打印机,多个同事同时发送打印任务会导致打印内容混乱。这就是典型的临界区问题。
互斥锁(Mutex)
互斥锁就像是洗手间的门锁,一次只允许一个人使用:
template <typename T, typename... Args>class Singleton {public:static T* getInstance(Args... args) {if (!instance) {mutex.lock(); // 加锁if (!instance) {instance = new T(args...);}mutex.unlock(); // 解锁}return instance;}private:static T* instance;static std::mutex mutex;};
一家银行只有一个柜台,顾客需要排队等待前面的人办完业务才能轮到自己,这就是互斥原则。
信号量(Semaphore)
信号量更像是有限资源的管理器,可以控制同时访问资源的线程数量:
class Semaphore {private:int count;std::mutex mtx;std::condition_variable cv;public:Semaphore(int c = 0) : count(c) {}void wait() {std::unique_lock<std::mutex> lock(mtx);while(count == 0) {cv.wait(lock);}count--;}void signal() {std::unique_lock<std::mutex> lock(mtx);count++;cv.notify_one();}};
电影院有100个座位,同时只能容纳100人观影。售票系统会跟踪剩余座位数,座位用完后,其他人必须等待有人离开才能进入。
条件变量(Condition Variable)
条件变量用于线程间的通知机制,比如生产者-消费者问题:
std::mutex mtx;std::condition_variable cv;std::queue<int> data_queue;// 生产者线程void producer() {for (int i = 0; i < 10; i++) {std::unique_lock<std::mutex> lock(mtx);data_queue.push(i);cv.notify_one(); // 通知消费者}}// 消费者线程void consumer() {while (true) {std::unique_lock<std::mutex> lock(mtx);cv.wait(lock, []{ return !data_queue.empty(); }); // 等待队列非空int data = data_queue.front();data_queue.pop();// 处理数据...}}
餐厅厨师(生产者)做好菜后会通知服务员(消费者)来取餐上菜。如果没有做好的菜,服务员就会等待;一旦有菜做好,厨师会通知服务员来取。
读写锁
读写锁允许多个线程同时读取共享资源,但写操作需要独占访问:
class ReadWriteLock {private:std::mutex mtx;std::condition_variable cv;int readers = 0;bool writer = false;public:void readLock() {std::unique_lock<std::mutex> lock(mtx);cv.wait(lock, [this]{ return !writer; }); // 等待没有写者readers++;}void readUnlock() {std::unique_lock<std::mutex> lock(mtx);readers--;if (readers == 0) {cv.notify_all(); // 如果没有读者了,通知可能在等待的写者}}void writeLock() {std::unique_lock<std::mutex> lock(mtx);cv.wait(lock, [this]{ return !writer && readers == 0; }); // 等待没有其他线程访问writer = true;}void writeUnlock() {std::unique_lock<std::mutex> lock(mtx);writer = false;cv.notify_all(); // 通知所有等待的线程}};
图书馆的书籍可以被多人同时阅读(读操作),但当有人要更新书籍内容(写操作)时,必须确保没有人在阅读,而且只能一个人进行更新。
三、优先级调度与死锁问题
优先级反转
优先级反转是指高优先级任务被低优先级任务间接阻塞的情况。
生活例子:一个重要客户(高优先级)需要VIP服务,但负责VIP服务的工作人员正在处理一个普通客户(低优先级)的问题,而这个问题需要等待后勤人员(中优先级)的协助,导致重要客户必须等待普通客户的问题解决后才能得到服务。
死锁问题
死锁是指两个或多个线程互相持有对方需要的资源,导致所有线程都无法继续执行。
// 潜在的死锁代码void thread1() {lock(mutex1);// 一些操作...lock(mutex2); // 可能导致死锁// 更多操作...unlock(mutex2);unlock(mutex1);}void thread2() {lock(mutex2);// 一些操作...lock(mutex1); // 可能导致死锁// 更多操作...unlock(mutex1);unlock(mutex2);}
两条狭窄的单行道互相交叉,两辆车分别占据一条道的入口,都想通过对方的道路继续前进,结果谁都无法移动。
避免死锁的策略
- 资源排序:按固定顺序申请资源
- 超时机制:资源获取设置超时,超时后释放已持有资源并重试
- 死锁检测:系统定期检查是否存在死锁,发现后强制终止某些线程
- 死锁预防:设计时避免死锁的四个必要条件之一
实战应用:生产者-消费者问题完整实现
生产者-消费者是一个经典的多线程协作问题,类似于餐厅的厨师和服务员关系。以下是一个完整的C++实现:
#include <iostream>#include <queue>#include <thread>#include <mutex>#include <condition_variable>const int BUFFER_SIZE = 10;class Buffer {private:std::queue<int> data;std::mutex mtx;std::condition_variable not_full;std::condition_variable not_empty;int capacity;public:Buffer(int cap) : capacity(cap) {}void produce(int item) {std::unique_lock<std::mutex> lock(mtx);not_full.wait(lock, [this]{ return data.size() < capacity; });data.push(item);std::cout << "生产: " << item << std::endl;lock.unlock();not_empty.notify_one();}int consume() {std::unique_lock<std::mutex> lock(mtx);not_empty.wait(lock, [this]{ return !data.empty(); });int item = data.front();data.pop();std::cout << "消费: " << item << std::endl;lock.unlock();not_full.notify_one();return item;}};void producer(Buffer& buffer, int start, int count) {for (int i = 0; i < count; i++) {buffer.produce(start + i);std::this_thread::sleep_for(std::chrono::milliseconds(100));}}void consumer(Buffer& buffer, int count) {for (int i = 0; i < count; i++) {buffer.consume();std::this_thread::sleep_for(std::chrono::milliseconds(200));}}int main() {Buffer buffer(BUFFER_SIZE);std::thread p1(producer, std::ref(buffer), 0, 10);std::thread p2(producer, std::ref(buffer), 100, 10);std::thread c1(consumer, std::ref(buffer), 10);std::thread c2(consumer, std::ref(buffer), 10);p1.join();p2.join();c1.join();c2.join();return 0;}
总结
计算机网络和多线程编程是现代软件开发中不可或缺的基础知识。理解IP地址与子网划分有助于我们设计高效的网络架构;掌握多线程同步机制则能帮助我们开发出高性能、安全的并发程序。
通过将这些抽象概念与日常生活中的例子关联起来,我们可以更直观地理解它们的作用和重要性。无论是网络通信还是多线程编程,核心都是协调和资源管理的艺术。
相关文章:
计算机网络与多线程同步机制详解
一、IP地址与子网划分 在互联网世界中,IP地址就像是每个设备的"门牌号",它使得数据包能够准确送达目的地。IP地址的划分与管理就像城市的规划,通过合理的子网划分,能够高效地管理网络资源。 子网掩码的工作原理 子网…...
栈溢出攻击最基本原理
函数在调用的过程中,函数在调用之前呢,会将调用完这个函数之后的下一条命令的地址保存到LR中。 void func() {int a[4];a[6] 100; } 这个函数在用gcc编译的时候是不会报错的,所以我们可以在尝试之后,修改LR的值,让代…...
ChemDraw、InDraw、KingDraw有什么差别?
在化学相关的科研与教学领域,一款好用的结构式编辑器至关重要,ChemDraw因此闻名;但近年来,ChemDraw代理商频繁发送律师函,给学校和企业带来诸多困扰,促使大家纷纷寻找替代软件。InDraw和KingDraw这两款软件…...
NVMe控制器IP设计之接口模块
这是NVMe控制器IP设计系列博客之一,其他的见本博客或csdn搜用户名:tiantianuser。相关视频见B站用户名:专注与守望。 接口转换模块负责完成AXI4接口与控制器内部的自定义接口之间的转换工作。接口转换模块的框图如图1所示。 图1 接口转换示…...
从0开始学linux韦东山教程第三章问题小结(2)
本人从0开始学习linux,使用的是韦东山的教程,在跟着课程学习的情况下的所遇到的问题的总结,理论虽枯燥但是是基础。 摘要关键词:PC远程访问ubuntu配置,ubuntu配置uboot环境,串口控制开发板 本文详细介绍以下问题&…...
JS正则表达式介绍(JavaScript正则表达式)
文章目录 JavaScript正则表达式完全指南正则表达式基础元字符与特殊字符基本元字符. - 点号\d - 数字\D - 非数字\w - 单词字符\W - 非单词字符\s - 空白字符\S - 非空白字符 正则表达式标志常用标志详解g - 全局匹配i - 忽略大小写m - 多行匹配s - 点号匹配所有字符u - Unicod…...
(51单片机)LCD显示红外遥控相关数字(Delay延时函数)(LCD1602教程)(Int0和Timer0外部中断教程)(IR红外遥控模块教程)
前言: 本次Timer0模块改装了一下,注意!!!今天只是简单的实现一下,明天用次功能显示遥控密码锁 演示视频: 在审核 源代码: 如上图将9个文放在Keli5 中即可,然后烧录在…...
关于单片机的基础知识(一)
成长路上不孤单😊😊😊😊😊😊 【14后😊///计算机爱好者😊///持续分享所学😊///如有需要欢迎收藏转发///😊】 今日分享关于单片机基础知识的相关内容…...
操作系统学习笔记第2章 (竟成)
第 2 章 进程管理 【考纲内容】 1.进程与线程: (1) 进程 / 线程的基本概念; (2) 进程 / 线程的状态与转换; (3) 线程的实现:内核支持的线程;线程库支持的线程; (4) 进程与线程的组织与控制; (5)…...
《从零开始:构建你的第一个区块链应用》
一、引言 区块链技术,这个曾经只在金融领域被广泛讨论的技术,如今已经渗透到各个行业。从供应链管理到智能合约,区块链的应用场景越来越丰富。对于开发者来说,理解区块链的基本原理并构建一个简单的区块链应用,是进入这…...
[思维模式-24]:《本质思考力》-5- 马克思主义毛泽东思想揭示了了人类社会运作的普遍规律有哪些?
目录 一、马克思主义毛泽东思想揭示了了人类社会运作的普遍规律有哪些? 1、生产力与生产关系的辩证运动规律 2、阶级斗争与社会革命规律 3、社会形态演变规律 4、人民群众是历史创造者的规律 5、社会基本矛盾运动规律 6、认识与实践的辩证关系规律 二、马克…...
CentOS7.9部署FunASR实时语音识别接口 | 部署商用级别实时语音识别接口FunASR
0. 环境说明 本次在云服务器中部署一套实时语音识别接口,基于阿里开源的FunASR。 云服务器使用莱卡云,4核心4GB内存50GB存储空间,带宽10Mbps。 操作系统使用CentOS7.9 视频演示可以看 云服务器中部署实时语音识别接口 | FunASR在云服务器…...
炫酷粒子系统动画实战:Matplotlib实现银河漩涡效果
炫酷粒子系统动画实战:Matplotlib实现银河漩涡效果 效果演示:银河粒子漩涡核心代码分析1. 粒子系统初始化2. 动画更新函数3. 渲染优化技巧 完整实现代码Matplotlib的动画模块介绍核心类对比核心功能分点注意事项 效果演示:银河粒子漩涡 动…...
MAD-TD: MODEL-AUGMENTED DATA STABILIZES HIGH UPDATE RATIO RL
ICLR 2025 spotlight paper 构建能够在少量样本下学习出优良策略的深度强化学习(RL)智能体一直是一个极具挑战性的任务。为了提高样本效率,近期的研究尝试在每获取一个新样本后执行大量的梯度更新。尽管这种高更新-数据比(UTD&am…...
机器学习第四讲:无监督学习 → 给无标签积木自由组合,发现隐藏规律
机器学习第四讲:无监督学习 → 给无标签积木自由组合,发现隐藏规律 资料取自《零基础学机器学习》。 查看总目录:学习大纲 关于DeepSeek本地部署指南可以看下我之前写的文章:DeepSeek R1本地与线上满血版部署:超详细…...
Vue 两种导航方式
目录 一、声明式导航 二、编程式导航 三、两句话总结 一、声明式导航 1. 传参跳转: <router-link :to"/user?nameCHEEMS&id114514">Query传参 </router-link><router-link :to"/user?参数名1参数值1&参数名2参数值2&a…...
HTTP 的发展史:从前端视角看网络协议的演进
别再让才华被埋没,别再让github 项目蒙尘!github star 请点击 GitHub 在线专业服务直通车GitHub赋能精灵 - 艾米莉,立即加入这场席卷全球开发者的星光革命!若你有快速提升github Star github 加星数的需求,访问taimili…...
Spring 必会之微服务篇(2)
经过上一篇文章的介绍,应该对微服务有了基本的认识,以及为什么要用微服务和微服务要面临的挑战和对应的解决问题,这一期继续聊聊关于微服务的相关知识。 服务拆分 为什么拆 对于大多数的小型项目来说,一般是先采用单体架构,但是随着后面的用户规模变大,业务越来越复杂…...
21.【.NET 8 实战--孢子记账--从单体到微服务--转向微服务】--单体转微服务--身份认证服务拆分规划
从这篇文章开始我们将开始一步一步的拆分现有的单体应用孢子记账项目。按照上一篇文章中的介绍,我们首先把身份认证服务拆分出来。 一、功能分析 在当前的单体应用中,身份认证服务主要负责用户认证、授权以及角色权限管理等核心功能。 在拆分之前&…...
人工智能100问☞第19问:什么是专家系统?
目录 一、通俗解释 二、专业解析 三、权威参考 专家系统是基于知识库(存储专家经验与规则)和推理机(模拟专家逻辑判断)的人工智能程序,能在特定领域(如医疗诊断、工业控制)高效解决复杂问题。 一、通俗解释 专家系统就像个“智能版老师傅…...
AutoGen+Deepseek+chainlit的简单使用
AutoGen 的应用场景 AutoGen 作为一个强大的多智能体协作框架,可用于多种复杂任务: 自动化工作流:构建由多个智能体组成的流水线,例如数据收集、分析、报告生成复杂问题分解:将难题拆解为子任务,分配给不…...
贪心算法专题(Part1)
目录 1. 贪心算法简介 2. 柠檬水找零 3. 将数组和减半的最少操作次数 4. 递增的三元子序列 5. K次取反后最大化的数组和 6. 增减字符串匹配 7. 分发饼干 8. 整数替换 1. 贪心算法简介 2. 柠檬水找零 题目链接:860. 柠檬水找零 - 力扣(LeetCode…...
PyTorch API 4 - 分布式通信、分布式张量
文章目录 分布式通信包 - torch.distributed后端支持PyTorch 内置的后端选择哪个后端?常见环境变量选择使用的网络接口其他NCCL环境变量 基础概念初始化返回类型:boolTCP初始化共享文件系统初始化环境变量初始化方法 初始化后操作关闭处理重新初始化 组D…...
《类和对象(中)》
引言: 上次我们主要学习了类的相关知识,今天我们就来学习类和对象(中),今天也会用到之前学习过的东西,可以说是前面知识的结合,较前面会难一点(打个预防针)。 一:类的默认成员函数…...
SSH终端登录与网络共享
SSH 是较可靠,专为远程登录会话和其他网络服务提供安全性的协议 注意 SSH终端登录的前提是:电脑和板卡都能够通过网络相连接及通信 与连接互联网不一样,SSH可以不用互联网,只要电脑和板卡组成一个小型网络即可 网络方案 如果您…...
n8n系列(5):LangChain与大语言模型应用
引言 n8n作为一个强大的工作流自动化平台,可以通过集成LangChain框架,为用户提供了便捷地利用OpenAI、Azure OpenAI等大语言模型的能力。 本文将深入探讨n8n中的AI集成功能,特别是LangChain节点的使用,以及如何构建智能化的工作流程来解决实际业务问题。 1. n8n的AI集成概…...
springboot3+vue3融合项目实战-大事件文章管理系统-更新用户信息
在一下三个代码处进行修改 在UserController里面增加uadate方法 PutMapping ("/update")public Result update(RequestBody Validated User user){userService.update(user);return Result.success();}在userservice中增加update方法 void update(User user); 然…...
20250510-查看 Anaconda 配置的镜像源
打开 Anaconda Prompt 查看 Anaconda 当前配置的镜像源,使用命令 conda config --show channels这将显示当前配置的通道(channels),即镜像源列表。 此外,还可以使用 conda config --show命令来显示conda的配置信息&…...
CDGP数据治理主观题评分标准与得分策略
1.数据模型题目评分标准 1)准确理解题目中所描述的业务逻辑和需求得[1分] 2)正确使用模型设计方法,使用信息工程、信息建模集成定义、巴克符号、陈氏符号等其中一种得[1分] 3)正确设计实体和属性,题目中涉及的实体数量为25-30个,10个以内得[2分],10-20个得[3分],25个…...
[学习]RTKLib详解:sbas.c与rtcm.c
RTKLib详解:sbas.c与rtcm.c 本文是 RTKLlib详解 系列文章的一篇,目前该系列文章还在持续总结写作中,以发表的如下,有兴趣的可以翻阅。 [学习] RTKlib详解:功能、工具与源码结构解析 [学习]RTKLib详解:pntp…...
【基础IO下】磁盘/软硬链接/动静态库
前言: 文件分为内存文件和磁盘文件。磁盘文件是一个特殊的存在,因为磁盘文件不属于冯诺依曼体系,而是位于专门的存储设备中。因此,磁盘文件存在的意义是将文件更好的存储起来,一边后续对文件进行访问。在高效存储磁盘…...
JAVA练习题(1) 卖飞机票
import java.util.Scanner; public class Main {public static void main(String[] args) {Scanner scnew Scanner(System.in);System.out.println("请输入飞机的票价:");int pricesc.nextInt();System.out.println("请输入月份:");…...
SpringBoot框架开发网络安全科普系统开发实现
概述 基于SpringBoot框架的网络安全科普系统开发指南,该系统集知识科普、案例学习、在线测试等功能于一体,本文将详细介绍系统架构设计、功能实现及技术要点,帮助开发者快速构建专业的网络安全教育平台。 主要内容 系统功能架构 本系统采…...
机器学习 day02
文章目录 前言一、TF-IDF特征词重要度特征提取二、无量纲化处理1.最大最小值归一化2.normalize归一化3.StanderScaler标准化 前言 通过今天的学习,我掌握了TF-IDF特征词重要度特征提取以及无量纲化处理的相关知识和用法 一、TF-IDF特征词重要度特征提取 机器学习算…...
《AI大模型应知应会100篇》第53篇:Hugging Face生态系统入门
第53篇:Hugging Face生态系统入门 ——从模型获取到部署的全流程实战指南 📌 摘要 在人工智能快速发展的今天,Hugging Face已成为自然语言处理(NLP)领域最具影响力的开源平台之一。它不仅提供丰富的预训练模型、强大…...
计网学习笔记———网络
🌿网络是泛化的概念 网络是泛化的概念 🍂泛化理解 网络的概念在生活中无处不在举例:社交网络、电话网路、电网、计算机网络 🌿网络的定义 定义: 离散的个体通过通讯手段连成群体,实现资源的共享与交流、个…...
Vue3 怎么在ElMessage消息提示组件中添加自定义icon图标
1、定义icon组件代码: <template><svg :class"svgClass" aria-hidden"true"><use :xlink:href"iconName" :fill"color"/></svg> </template><script> export default defineComponen…...
17.Excel:实用的 VBA 自动化程序
一 excel 设置 开始-选项 二 批量创建工作表 某工作簿用于保存31天的东西,手动创建31个工作表不方便。 A1单元格输入内容,或者空着。从A2单元格开始,一定要以字符形式的,不能以数值和日期形式。12345这是数值形式,1月…...
Kubernetes生产实战(十六):集群安全加固全攻略
Kubernetes集群安全加固全攻略:生产环境必备的12个关键策略 在容器化时代,Kubernetes已成为企业应用部署的核心基础设施。但根据CNCF 2023年云原生安全报告显示,75%的安全事件源于K8s配置错误。本文将基于生产环境实践,系统讲解集…...
Cadence学习笔记之---导入PCB板框、网表
目录 01 | 引 言 02 | 环境描述 03 | 导入PCB板框 04 | 自画PCB板框 05 | 导入PCB网表 06 | 总 结 01 | 引 言 在上一篇小记中讲述了创建PCB工程的操作步骤、PCB工程中的类与子类,以及Cadence颇具特色的颜色管理器。 本篇小记主要记述如何导入PCB板框、自画…...
嵌入式硬件篇---麦克纳姆轮(简单运动实现)
文章目录 前言1. 麦克纳姆轮的基本布局X型布局O型布局 2. 运动模式实现原理(1) 前进/后退前进后退 (2) 左右平移向左平移向右平移 (3) 原地旋转顺时针旋转(右旋)逆时针旋转(左旋) (4) 斜向移动左上45移动 (5) 180旋转 3. 数学原理…...
en33网络配置文件未托管
从 nmcli device status 的输出可以看到,所有网络设备(包括 ens33)都处于 "未托管"(unmanaged)状态,这导致 NetworkManager 和传统的 network.service 都无法管理网络接口,从而引发 n…...
嵌入式学习--江协51单片机day4
昨天周五没有学习,因为中午没有睡觉,下午和晚上挤不出整块的时间。周日有考试今天也没有学很多啊,但以后周末会是学一天,另一天休息和写周总结。 今天学了串口通信和LED点阵屏,硬件原理是真的很迷,一但想搞…...
Hadoop 2.x设计理念解析
目录 一、背景 二、整体架构 三、组件详解 3.1 yarn 3.2 hdfs 四、计算流程 4.1 上传资源到 HDFS 4.2 向 RM 提交作业请求 4.3 RM 调度资源启动 AM 4.4 AM运行用户代码 4.5 NodeManager运行用户代码 4.6 资源释放 五、设计不足 一、背景 有人可能会好奇…...
diy装机成功录
三天前,我正式开启了这次装机之旅,购入了一颗性能强劲的 i5-12400 CPU,一块绘图能力出色的 3060ti 显卡,还有技嘉主板、高效散热器、16G 内存条、2T 固态硬盘,以及气派的机箱和风扇,满心期待能亲手打造一台…...
睿思量化小程序
睿思量化小程序是成都睿思商智科技有限公司最新研发和运营的金融数据统计分析工具,旨在通过量化指标筛选与多策略历史回测,帮助用户科学配置基金资产,成为个人投资者与机构用户的“智能化财富管家”。 核心功能:数据驱动决策&…...
STM32实现九轴IMU的卡尔曼滤波
在嵌入式系统中,精确的姿态估计对于无人机、机器人和虚拟现实等应用至关重要。九轴惯性测量单元(IMU)通过三轴加速度计、陀螺仪和磁力计提供全面的运动数据。然而,这些传感器数据常伴随噪声和漂移,单独使用无法满足高精…...
JS DOM操作与事件处理从入门到实践
对于前端开发者来说,让静态的 HTML 页面变得生动、可交互是核心技能之一。实现这一切的关键在于理解和运用文档对象模型 (DOM) 以及 JavaScript 的事件处理机制。本文将带你深入浅出地探索 DOM 操作的奥秘,并掌握JavaScript 事件处理的方方面面。 目录 …...
Hive表JOIN性能问
在处理100TB的Hive表JOIN性能问题时,需采用分层优化策略,结合数据分布特征、存储格式和计算引擎特性。以下是系统性优化方案: 1. 数据倾斜优化(Skew Join) 1.1 识别倾斜键 方法:统计JOIN键的分布频率&…...
关键点检测--使用YOLOv8对Leeds Sports Pose(LSP)关键点检测
目录 1. Leeds Sports Pose数据集下载2. 数据集处理2.1 获取标签2.2 将图像文件和标签文件处理成YOLO能使用的格式 3. 用YOLOv8进行训练3.1 训练3.2 预测 1. Leeds Sports Pose数据集下载 从kaggle官网下载这个数据集,地址为link,下载好的数据集文件如下…...