【中间件】bthread_数据结构_学习笔记
bthread数据结构
- bthread_数据结构_学习笔记
- 1 pthread_cond_t
- 1.1 definition
- 1.2 解释
- 1.3 设计动机
- 1.4 使用示例
- 1.5 注意事项
- 1.6 进一步延伸:pthread_cond_s
- 2 pthread_mutex_t
bthread_数据结构_学习笔记
1 pthread_cond_t
POSIX线程库 /usr/include/x86_64-linux-gnu/bits/pthreadtypes.h
底层通过union实现,系统编程中“隐藏实现细节,暴露稳定接口”的经典范例。
主要目的是为了兼容不同平台的底层实现差异,同时确保类型的内存布局和对齐方式符合规范。
- 类型抽象:隐藏平台差异,提供统一接口。
- 内存安全:固定大小和强制对齐避免常见错误。
- 灵活初始化:支持静态和动态初始化方式。
1.1 definition
typedef union {struct __pthread_cond_s __data; // 实际存储条件变量数据的结构体char __size[__SIZEOF_PTHREAD_COND_T]; // 保证联合体大小与平台实现一致__extension__ long long int __align; // 强制对齐(通常是 8 字节对齐)
} pthread_cond_t;
1.2 解释
-
struct __pthread_cond_s __data
- 包含条件变量的实际数据(如等待队列、计数器等),具体字段由底层实现定义。
- 开发者通常不直接操作此结构体,而是通过
pthread_cond_*
系列函数(如pthread_cond_init
,pthread_cond_wait
)间接使用。
-
char __size[__SIZEOF_PTHREAD_COND_T]
- 用于确保联合体的总大小与平台实现的
pthread_cond_t
一致。 __SIZEOF_PTHREAD_COND_T
是一个宏,表示目标平台上pthread_cond_t
的字节数,由编译器或系统头文件提供。
- 用于确保联合体的总大小与平台实现的
-
long long int __align
- 强制联合体按
long long
(通常 8 字节)对齐,避免内存对齐问题。 __extension__
是 GCC 扩展语法,用于忽略编译器的严格标准检查。
- 强制联合体按
1.3 设计动机
-
跨平台兼容性
- 不同操作系统或硬件架构对
pthread_cond_t
的实现可能不同(如字段顺序、对齐要求)。 - 通过联合体将实现细节隐藏在
__data
结构体中,用户只需使用pthread_cond_t
类型,无需关心底层差异。
- 不同操作系统或硬件架构对
-
固定内存布局
__size
数组确保联合体的大小严格等于__SIZEOF_PTHREAD_COND_T
,避免用户误分配不足内存。- 例如,静态初始化条件变量时,用户可以直接用
PTHREAD_COND_INITIALIZER
宏,而无需知道具体结构。
-
对齐控制
__align
成员确保联合体按最大对齐要求(如 8 字节)分配内存,防止因对齐不当导致的性能问题或硬件异常。
1.4 使用示例
// 静态初始化(依赖联合体的大小和对齐)
pthread_cond_t cond = PTHREAD_COND_INITIALIZER;// 动态初始化
pthread_cond_t cond;
pthread_cond_init(&cond, NULL);// 使用条件变量
pthread_cond_wait(&cond, &mutex);
1.5 注意事项
-
不要直接操作
__data
成员
条件变量的内部结构是平台相关的,直接访问可能导致不可移植或未定义行为。 -
依赖标准函数
始终使用pthread_cond_*
函数操作条件变量,而非手动修改联合体成员。 -
内存对齐
联合体的对齐机制确保了跨平台安全性,但用户仍需避免将pthread_cond_t
放置在不对齐的内存地址。
1.6 进一步延伸:pthread_cond_s
Linux 系统中 POSIX 条件变量 pthread_cond_t
的底层实现。是 Linux 高效线程同步的核心,通过原子计数器、分组策略和引用机制,平衡了性能与正确性。理解其字段有助于:
- 调试复杂的线程竞争问题。
- 编写高性能的多线程代码(如避免不必要的广播)。
- 深入操作系统级并发原语的实现原理。
它的字段设计用于高效管理线程的等待与唤醒机制,同时确保线程安全和性能。
definition
struct __pthread_cond_s {__atomic_wide_counter __wseq; // 全局等待序列号(原子计数器)__atomic_wide_counter __g1_start; // 第一组(Group 1)的起始序列号(原子计数器)unsigned int __g_refs[2]; __LOCK_ALIGNMENT // 组的引用计数(每个组对应一个槽)unsigned int __g_size[2]; // 组的大小(跟踪每个组的等待线程数)unsigned int __g1_orig_size; // Group 1 的原始大小(用于广播操作)unsigned int __wrefs; // 等待者的引用计数(防止销毁时竞争)unsigned int __g_signals[2]; // 组的待处理信号数(唤醒信号计数)
} __LOCK_ALIGNMENT; // 结构体对齐(通常与锁对齐一致)
字段详细说明
-
__atomic_wide_counter __wseq
- 作用:全局等待序列号,原子计数器。
- 细节:
- 每个线程在调用
pthread_cond_wait
进入等待前会递增此值,表示一次新的等待事件。 - 用于唯一标识等待操作的顺序,避免唤醒操作(如
pthread_cond_signal
或pthread_cond_broadcast
)遗漏或重复。
- 每个线程在调用
-
__atomic_wide_counter __g1_start
- 作用:第一组(Group 1)的起始等待序列号。
- 细节:
- 条件变量将等待线程划分为两个组(Group 1 和 Group 2),以减少竞争。
__g1_start
记录 Group 1 的起始序列号,当 Group 1 的线程全部被唤醒后,Group 2 会晋升为新的 Group 1。
-
unsigned int __g_refs[2]
- 作用:每个组的引用计数,用于跟踪活跃的等待线程数。
- 细节:
- 索引
0
对应 Group 1,索引1
对应 Group 2。 - 线程进入等待时会增加对应组的引用计数,唤醒后减少。
- 防止在唤醒操作过程中组被错误回收。
- 索引
-
unsigned int __g_size[2]
- 作用:每个组的当前等待线程数。
- 细节:
- 与
__g_refs
配合使用,确保唤醒操作(如pthread_cond_broadcast
)能正确统计需要唤醒的线程数量。 - 例如,
pthread_cond_broadcast
会唤醒某个组的所有线程,__g_size
用于确定唤醒的数量。
- 与
-
unsigned int __g1_orig_size
- 作用:Group 1 的原始大小,用于广播操作。
- 细节:
- 在调用
pthread_cond_broadcast
时,会记录 Group 1 的初始大小,确保所有在广播前进入等待的线程都被唤醒。 - 避免广播过程中新加入的线程被错误唤醒。
- 在调用
-
unsigned int __wrefs
- 作用:等待者的引用计数。
- 细节:
- 跟踪当前正在等待的线程总数(包括所有组)。
- 在销毁条件变量(
pthread_cond_destroy
)时,需确保__wrefs
为 0,防止有线程仍在等待时销毁资源。
-
unsigned int __g_signals[2]
- 作用:每个组的待处理唤醒信号数。
- 细节:
- 当调用
pthread_cond_signal
或pthread_cond_broadcast
时,信号会被记录到对应组的__g_signals
中。 - 等待线程被唤醒前会检查此值,确保每个信号只唤醒一个线程(避免“惊群效应”)。
- 当调用
-
__LOCK_ALIGNMENT
-
作用:结构体对齐标记。
-
细节:
- 通常与系统锁(如
pthread_mutex_t
)的对齐方式一致,确保条件变量和互斥锁在内存中正确对齐,避免性能下降或硬件异常。 - 处理器访问内存时,若数据的地址是某个值的整数倍(如4字节对齐的地址为4的倍数),则访问效率更高。
- 未对齐的访问可能导致:
- 性能下降:处理器可能需要多次内存操作来读取或写入未对齐的数据。
- 硬件异常:在某些架构(如ARM或SPARC)上,未对齐访问会直接触发错误。
- 原子操作失败:同步原语(如锁)依赖原子指令,未对齐的结构体可能导致指令无法正确执行。
- 通常与系统锁(如
-
平台兼容性
- 不同硬件架构(如x86、ARM、RISC-V)的对齐要求可能不同。例如:
- x86 允许未对齐访问(但性能较低)。
- ARMv7 要求严格对齐,否则触发总线错误。
- 不同硬件架构(如x86、ARM、RISC-V)的对齐要求可能不同。例如:
-
__LOCK_ALIGNMENT 通过宏定义适配目标平台的对齐要求,例如:
#define __LOCK_ALIGNMENT __attribute__((aligned(8))) // 8字节对齐
确保结构体在所有平台上均按硬件要求对齐。 -
优化内存访问
- 对齐后的结构体字段排列更紧凑,减少填充(Padding)字节,节省内存。
- 对齐的字段可被处理器单次内存操作访问,提升指令执行效率。
-
支持原子操作
- 条件变量的实现依赖原子计数器(如 __atomic_wide_counter)。
- 原子操作指令(如CAS, LL/SC)通常要求操作数对齐。未对齐的原子操作可能失败或不可用。
-
__LOCK_ALIGNMENT 确保原子字段(如 __wseq、__g1_start)按原子指令的要求对齐。
-
作用归纳:
- 兼容性:适配不同硬件平台的对齐要求。
- 性能优化:减少伪共享、提升内存访问效率。
- 正确性:确保原子操作和同步机制可靠工作。
- 协作安全:与互斥锁对齐一致,避免协同使用时的潜在问题。
-
系统级编程中“显式控制内存布局”的典范,确保了多线程同步原语的高效与稳定.
-
组(Group)机制
条件变量通过 分组策略 优化唤醒操作:
- Group 1 和 Group 2:
- Group 1 是当前活跃的等待组,新线程在等待时加入 Group 1。
- 当 Group 1 的线程被全部唤醒后,Group 2 晋升为新的 Group 1,避免操作同一组时的竞争。
- 广播(Broadcast)优化:
pthread_cond_broadcast
会唤醒 Group 1 的所有线程,同时记录__g1_orig_size
确保只唤醒广播前的等待线程。
- 信号分发:
pthread_cond_signal
优先唤醒 Group 1 的线程,若 Group 1 无等待线程,则唤醒 Group 2。
关键操作流程
-
等待操作(
pthread_cond_wait
)- 线程递增
__wseq
进入等待队列。 - 根据当前组策略(Group 1 或 Group 2)更新
__g_refs
和__g_size
。 - 检查
__g_signals
,若无待处理信号,则阻塞线程。
- 线程递增
-
唤醒单个线程(
pthread_cond_signal
)- 检查 Group 1 的
__g_size
,若有等待线程,递增__g_signals[0]
并唤醒一个线程。 - 若 Group 1 无等待线程,则对 Group 2 执行相同操作。
- 检查 Group 1 的
-
唤醒所有线程(
pthread_cond_broadcast
)- 记录
__g1_orig_size
为当前 Group 1 的大小。 - 将
__g_signals[0]
设为__g1_orig_size
,唤醒所有 Group 1 的线程。 - Group 1 的线程唤醒后,
__g_refs[0]
和__g_size[0]
被清零,Group 2 晋升为新 Group 1。
- 记录
优势
- 减少锁竞争
- 通过分组机制将唤醒操作分散到不同组,降低多核环境下的锁争用。
- 避免信号丢失
- 原子计数器和序列号确保每个等待线程都能被正确追踪。
- 高效广播
__g1_orig_size
和__g_signals
的配合使广播操作无需遍历队列,直接通过计数器批量唤醒。
- 内存安全
__wrefs
防止条件变量在销毁时仍有线程等待。
示例场景
假设一个生产者-消费者模型:
- 消费者线程 调用
pthread_cond_wait
进入等待,加入 Group 1,递增__wseq
、__g_refs[0]
和__g_size[0]
。 - 生产者线程 调用
pthread_cond_signal
,发现 Group 1 的__g_size[0] > 0
,递增__g_signals[0]
并唤醒一个消费者。 - 唤醒的消费者递减
__g_refs[0]
和__g_size[0]
,继续执行任务。
2 pthread_mutex_t
相关文章:
【中间件】bthread_数据结构_学习笔记
bthread数据结构 bthread_数据结构_学习笔记1 pthread_cond_t1.1 definition1.2 解释1.3 设计动机1.4 使用示例1.5 注意事项1.6 进一步延伸:pthread_cond_s 2 pthread_mutex_t bthread_数据结构_学习笔记 1 pthread_cond_t POSIX线程库 /usr/include/x86_64-linux…...
VM虚拟机安装CentOS7.9
目录 1.下载CentOS7.9 2.VM虚拟机选择自定义,然后一直傻瓜式下一步 3.选择编辑虚拟机设置,然后选择刚刚下载的ISO 4.输入 ip addr 获取ip地址 5.用Xshell连接 1.下载CentOS7.9 链接:https://pan.baidu.com/s/1kW2gGWnbcjNtq4kz46LKVw?p…...
C++/SDL 进阶游戏开发 —— 双人塔防(代号:村庄保卫战 18)
🎁个人主页:工藤新一 🔍系列专栏:C面向对象(类和对象篇) 🌟心中的天空之城,终会照亮我前方的路 🎉欢迎大家点赞👍评论📝收藏⭐文章 文章目录 二…...
Cribl 数据脱敏 更多方法 MASK (三)
我做过好几个cribl 数据脱敏的实验: Cribl 脱敏mask-CSDN博客...
【笔记】深度学习模型训练的 GPU 内存优化之旅⑤:内存分配篇
开设此专题,目的一是梳理文献,目的二是分享知识。因为笔者读研期间的研究方向是单卡上的显存优化,所以最初思考的专题名称是“显存突围:深度学习模型训练的 GPU 内存优化之旅”,英文缩写是 “MLSys_GPU_Memory_Opt”。…...
【5G 架构】边缘计算平台是如何与3GPP网络连接的?
博主未授权任何人或组织机构转载博主任何原创文章,感谢各位对原创的支持! 博主链接 本人就职于国际知名终端厂商,负责modem芯片研发。 在5G早期负责终端数据业务层、核心网相关的开发工作,目前牵头6G技术研究。 博客内容主要围绕…...
5.0.0 GripSpliter的使用(探讨水平竖直对齐参数)
布局控件Grid 配合 GridSplitter 无需编写任何代码 就能实现网格大小可拖动。 其HorizontalAlignment、VerticalAlignment属性的使用非常具有迷惑性;本文做了一些一些实验,总结为把这两个属性均设置为strech即可。 总结如下:经过实验,发现以下情况可以正常工作。 水平方向…...
python如何把pdf转word
在Python中将PDF转换为Word文档(.docx)比反向转换(Word转PDF)更具挑战性,因为PDF是固定格式,而Word是可编辑格式。以下是几种可行的方法及详细步骤: 方法1:使用 pdf2docx 库 pdf2do…...
go实现双向链表
需求 实现双向链表的节点生成、正反向遍历、指定删除。 实现 package mainimport ("fmt" )type zodiac_sign struct {number intdizhi stringanimal stringyear intprevious *zodiac_signnext *zodiac_sign }// 添加 // func add_node_by_order(pr…...
33、VS中提示“以下文件中的行尾不一致。是否将行尾标准化?“是什么意思?
在Visual Studio(VS)中遇到提示“以下文件中的行尾不一致。是否将行尾标准化?”时,意味着当前打开或正在编辑的文件内部存在行尾符(EOL,End-Of-Line)格式不统一的情况。以下是详细解释和应对建议…...
C 语言 第五章 指针(5)
目录 函数参数传递机制:地址传递 值传递 简单变量指针作为形参 举例1: 举例2: 举例3: 数组作为形参 举例: 函数参数传递机制:地址传递 值传递 void test(int a, int b) { a 10; b 20; print…...
Python项目源码69:Excel数据筛选器1.0(tkinter+sqlite3+pandas)
功能说明:以下是一个使用Tkinter和Pandas实现的完整示例,支持Excel数据读取、双表格展示和高级条件筛选功能: 1.文件操作:点击"打开文件"按钮选择Excel文件(支持.xlsx和.xls格式),自…...
机器人--架构及设备
机器人的四大组成部分 控制系统 驱控系统 驱控驱动系统控制系统。 注意,这里的控制系统不是机器人层面的控制系统,属于更小层级的,驱控系统的控制系统。 驱动系统: 一般指硬件设备,比如电机驱动器,I/O…...
机器人--主机--控制系统
机器人主机 机器人主机,即控制系统。 作用 机器人主机的核心功能 传感器数据处理:处理摄像头、激光雷达、IMU等数据。 运行SLAM/导航算法:如Google Cartographer、RTAB-Map。 路径规划与控制:执行A*、DWA等算法。 通信管理&a…...
Stm32 烧录 Micropython
目录 前言 准备工作 开始操作 问题回顾 后记 前言 去年曾经尝试Pico制作openmv固件,由于知识储备不够最后失败了,留了一个大坑,有了前几天的基础,慢慢补齐知识,最近这一周一直在学习如何编译Stm固件并烧录到单片机…...
leetcode 977. Squares of a Sorted Array
题目描述 双指针法一 用right表示原数组中负数和非负数的分界线。 nums[0,right-1]的是负数,nums[right,nums.size()-1]是非负数。 然后用合并两个有序数组的方法。合并即可。 class Solution { public:vector<int> sortedSquares(vector<int>&…...
使用Nexus搭建远程maven仓库
1、Nexus介绍 Nexus 是 Sonatype 公司的一款用于搭建私服的产品,使用非常广泛。在早期,我们都拿Nexus当maven私服仓库,后来,随着版本不断更新,它支持的数据类型越来越多,比如npm仓库,nuget仓库&…...
坚鹏:工行《DEEPSEEK赋能银行智能办公及数字化营销服务》培训
中国工商银行上海市分行《DEEPSEEK赋能银行智能办公及数字化营销服务》培训圆满落幕 中国工商银行作为全球领先的综合性金融服务集团,始终走在金融科技创新的前沿。截至2024年末,工商银行总资产规模突破40万亿元,连续多年稳居全球银行榜首。在…...
操作系统OS是如何指挥外围设备的呢?
众所周知,OS的职责之一就是管理外围设备,比如常见的磁盘、硬盘、显示器、麦克风等,但并不是外围设备的一切都必须由OS管理,比如无线鼠标上的开关键,当你通过它关闭鼠标时,这个操作并不会经过OS,…...
实现Sentinel与Nacos的规则双向同步
实现Sentinel与Nacos的规则双向同步:完整解决方案 前言 在微服务架构中,流量控制和熔断降级是保障系统稳定性的重要手段。阿里开源的Sentinel作为一款轻量级的流量控制组件,常被用于实现这些功能。然而,在实际生产环境中&#x…...
2025五一杯数学建模A题:支路车流量推测问题,思路分析+模型代码
一持续更新,见文末名片 二、问题背景 想象一下,城市的道路如同一张巨大的脉络图,主路如同大动脉,配备着车流量监测设备,能实时记录车流量数据,就像我们身体的传感器一样。然而,当多条支路像毛细…...
Linux51 安装baidunetdisk yum install rpm -ivh
推测网卡 感觉是不是以前哪里设置了下 deepseek说的这个设置 我没有设置过 这个不会弄啊 准备用虚拟机安个软件 神奇 换了这个命令又能打开网卡了 参考了这个 参考 之前地址我觉得配置错误 动态分配 我就删掉ip地址了 路由表中无ip地址吗? OK 卸载 运…...
【Python-Day 8】从入门到精通:Python 条件判断 if-elif-else 语句全解析
Langchain系列文章目录 01-玩转LangChain:从模型调用到Prompt模板与输出解析的完整指南 02-玩转 LangChain Memory 模块:四种记忆类型详解及应用场景全覆盖 03-全面掌握 LangChain:从核心链条构建到动态任务分配的实战指南 04-玩转 LangChai…...
若依 FastAPI + Vue3 项目 Docker 部署笔记( 启动器打包教程)
本文记录了将 start.bat 打包成 .exe 启动器的详细教程,适合项目交付或导师演示用。 🧭 一、如何将 start.bat 打包为启动器 .exe(含图标 自动打开浏览器) ✅ 1. 创建三大功能脚本 start.bat → 启动项目(docke…...
Lebesgue测度和积分理论发展概观
1. 发展背景 积分可以从两个角度来理解。首先,积分是微分的逆函数,因此积分是反导数(译注:但积分是独立于微分的,不能微分的函数也可能可积)。然而,这是一个非常抽象的概念。其次,两点之间的积分可以看…...
算法题题型总结
二叉树题型 解法综述:二叉树的解法,基本上都是依赖遍历,再加上递归的思路来做的。那递归又分为深度优先和广度优先。深度优先算法,前序,中序,后序。广度优先,利用先进先出队列,一层…...
网络编程——TCP和UDP详细讲解
文章目录 TCP/UDP全面详解什么是TCP和UDP?TCP如何保证可靠性?1. 序列号(Sequence Number)2. 确认应答(ACK)3. 超时重传(Timeout Retransmission)4. 窗口控制(Sliding Win…...
Qt多线程TCP服务器实现指南
在Qt中实现多线程TCP服务器可以通过为每个客户端连接分配独立的线程来处理,以提高并发性能。以下是一个分步实现的示例: 1. 自定义工作线程类(处理客户端通信) // workerthread.h #include <QObject> #include <QTcpSo…...
【经管数据】A股上市公司资产定价效率数据(2000-2023年)
数据简介:资产定价效率是衡量市场是否能够有效、准确地反映资产内在价值的重要指标。在理想的市场条件下,资产的市场价格应该与其内在价值保持一致,即市场定价效率达到最高。然而,在实际市场中,由于信息不对称、交易摩…...
打包 Python 项目为 Windows 可执行文件:高效部署指南
Hypackpy 是一款由白月黑羽开发的 Python 项目打包工具,它与 PyInstaller 等传统工具不同,通过直接打包解释器环境和项目代码,并允许开发者修改配置文件以排除不需要的内容,从而创建方便用户一键运行的可执行程序。以下是使用 Hyp…...
【QNX+Android虚拟化方案】138 - USB 底层传输原理
【QNX+Android虚拟化方案】138 - USB 底层传输原理 1. USB 数据包的格式2. 数据传输事务过程3. 四种传输类型3.1 批量传输3.2 中断传输3.3 实时传输3.4 控制传输4. USB 设备枚举过程4.1 Attached: 发送控制传输,读取设备描述符4.2 Power -> Default 这个状态无数据传输4.3 …...
QT6 源(66)篇三:阅读与注释类 QAbstractSpinBox ,这是螺旋框的基类,附上源码
(9)所有代码来自于头文件 qabstractspinbox . h : #ifndef QABSTRACTSPINBOX_H #define QABSTRACTSPINBOX_H#include <QtWidgets/qtwidgetsglobal.h> #include <QtWidgets/qwidget.h> #include <QtGui/qvalidator.h>/* QT_CONFIG宏实…...
MCP入门
什么是mcp mcp(model context protocol,模型上下文协议) 标准化协议:让大模型用统一的方式来调用工具,是llm和工具之间的桥梁 A2A:Agent-to-Agent协议 mcp通信机制 提供mcp服务查询的平台 具有工具合集…...
FPGA中级项目8———UART-RAM-TFT
FPGA中级项目8———UART-RAM-TFT UART串口我们学过,RAM IP核学过,TFT同样也学过。那如何将它们联合起来呢? 言简意赅:实现从串口写入图像到RAM并且由TFT显示屏输出! 首先第一步,便是要将UART_RX与RAM之间…...
Ocelot\Consul\.NetCore的微服务应用案例
案例资料链接:https://download.csdn.net/download/ly1h1/90733765 1.效果 实现两个微服务ServerAPI1和ServerAPI2的负载均衡以及高可用。具体原理,看以下示意图。 2.部署条件 1、腾讯云的轻量化服务器 2、WindowServer2016 3、.NETCore7.0 4、Negut …...
数值求解Eikonal方程的方法及开源实现
Eikonal方程是一类非线性偏微分方程,形式为 ( |\nabla u(x)| f(x) ),常见于波传播、几何光学、最短路径等问题。以下是数值求解Eikonal方程的方法及开源实现参考: 一、数值求解方法 有限差分法(FDM) 快速行进法&#…...
Http详解
🧱 一、从 TCP 三次握手到访问网页:两层过程 🧩 1. TCP 三次握手(网络传输层) 这是 建立连接 的前提,跟 HTTP 无关,但 HTTP 要依赖它。 举例:你打开浏览器访问 https://example.c…...
实验五 完整性
一、引言 本次上机实验的目的主要是让学生掌握数据库完整性的三大类型(实体完整性、参照完整性、用户自定义完整性),并通过实际建库建表和数据操作加深理解。 下面将为分别展示 student、course、sc 三个表的创建语句,并设置对应的…...
《原码、反码与补码:计算机中的数字奥秘》
🚀个人主页:BabyZZの秘密日记 📖收入专栏:C语言 🌍文章目入 一、原码:最直观的表示法1. 正数的原码2. 负数的原码3. 原码的特点 二、反码:原码的“反转”1. 正数的反码2. 负数的反码3. 反码的特…...
论文笔记——QWen2.5 VL
目录 引言架构创新数据整理与训练策略性能与基准测试精细感知能力应用与现实世界影响与现有模型比较结论 引言 视觉理解和自然语言处理的集成一直是人工智能研究的一个重要焦点,促成了日益复杂的视觉语言模型 (VLMs) 的发展。由阿里巴巴集团 Qwen 团队开发的 Qwe…...
前端HTML基础知识
1.HTML介绍 HTML(HyperText Markup Language,超文本标记语言)是构成网页的基本元素,是一种用于创建网页的标准化标记语言。HTML不是一种编程语言,而是一种标记语言,通过标签来描述网页的结构和内容。 超文本:超文本是…...
程序代码篇---ESP32云开发
文章目录 前言 前言 本文简单介绍了实现 ESP32-S3 传感器数据上传至云平台 手机远程控制电机 的完整方案,涵盖推荐的云平台、手机端。 一、推荐云平台及工具 云平台选择 阿里云 IoT 平台 优势:国内稳定、支持大规模设备接入、提供完整设备管理及安全…...
【C语言】文本操作函数fseek、ftell、rewind
一、fseek int fseek ( FILE * stream, long int offset, int origin ); 重新定位文件指针的位置,使其指向以origin为基准、偏移offset字节的位置。 成功返回0,失败返回非零值(通常为-1)。 origin有如下三种:分别是…...
ARM ASM
ARM ASM ARM寄存器集 列出了ARM的16个程序员可见寄存器(r0~r15)以及它的状态寄存器。 ARM共有14个通用寄存器r0~r13。寄存器r13被保留用作栈指针,r14存放子程 序返回地址,r15为程序计数器。 由于r15能够被程序员访问,…...
【五一培训】Day1
注: 1. 本次培训内容的记录将以“Topic”的方式来呈现,用于记录个人对知识点的理解。 2. 由于培训期间,作者受限于一些现实条件,本文的排版及图片等相关优化,需要过一段时间才能完成。 Topic 1:使用DeepS…...
SpringBoot使用分组校验解决同一个实体对象在不同场景下需要不同校验规则的问题
背景 添加分类的接口不需要id字段,但更新分类的接口需要id字段,当在id字段上使用NotNull注解时,会导致使用添加分类接口报id字段不能为空的错误 解决 定义分组 pojo/Category.java // 如果没有指定分组,则默认属于Default分组…...
Hibernate与MybatisPlus的混用问题(Invalid bound statement (not found))
当项目里已经有了Hibernate后: spring:jpa:hibernate:ddl-auto: updateshow-sql: trueproperties:hibernate:format_sql: true 再配置yml文件就会失效: mybatis-plus:mapper-locations: classpath:mapper/*.xml# 全局策略global-config:db-config:# 自…...
【音视频】ffplay数据结构分析
struct VideoState 播放器封装 typedef struct VideoState {SDL_Thread *read_tid; // 读线程句柄AVInputFormat *iformat; // 指向demuxerint abort_request; // 1时请求退出播放int force_refresh; // 1时需要刷新画⾯,请求⽴即刷新画⾯的意思int paused; // 1时…...
PV操作:宣帧闯江湖武林客栈版学习笔记【操作系统】
P,V,S江湖话翻译 P(申请) 江湖侠客拔剑大喊“掌柜的,给我一间上房!”(申请资源,房不够就蹲门口等)-要房令牌 V(释放) 江湖侠客退房时甩出一锭银子,大喊“…...
精品推荐-湖仓一体电商数据分析平台实践教程合集(视频教程+设计文档+完整项目代码)
精品推荐,湖仓一体电商数据分析平台实践教程合集,包含视频教程、设计文档及完整项目代码等资料,供大家学习。 1、项目背景介绍及项目架构 2、项目使用技术版本及组件搭建 3、项目数据种类与采集 4、实时业务统计指标分析一——ODS分层设计与…...