- 博客(78)
- 收藏
- 关注
原创 C++编译过程与GDB调试段错误和死锁问题
本文详细介绍了C++程序的编译流程和GDB调试技巧。编译过程包含预处理、编译、汇编和链接四个阶段,每个阶段都可能出现特定错误,如宏定义错误、语法错误或链接错误等。文章重点讲解了GDB调试工具的使用方法,包括常用命令如断点设置、变量查看、单步执行等,并针对常见问题如段错误和死锁提供了具体调试方案。通过生成Core文件分析段错误,以及使用线程调用栈追踪死锁位置,帮助开发者快速定位和解决程序运行中的问题。掌握这些编译和调试技巧能显著提升C++开发效率。
2025-08-03 18:32:01
249
原创 流媒体传输:RTSP传输详解(包含RTP,RTCP,RTSP详解)
RTSP协议是一种应用层网络协议,用于实时流媒体传输控制。它不直接传输媒体数据,而是通过发送指令(如播放、暂停)来控制RTP/RTCP的媒体流传输。RTSP与RTP、RTCP、SDP协同工作:RTSP负责会话控制,RTP传输实际媒体数据(通常基于UDP),RTCP监控传输质量,SDP描述媒体格式信息。RTSP会话流程包括OPTIONS、DESCRIBE/SETUP、PLAY/RECORD等步骤,通过SessionID管理会话状态。该协议支持推流和拉流两种模式,广泛应用于视频监控、直播等场景,具有低延迟、高可
2025-07-27 00:53:44
1129
原创 Git 详解:从概念,常用命令,版本回退到工作流
本文系统介绍了Git版本控制工具的核心概念与应用。主要内容包括:Git与GitHub的基本概念,Windows/Ubuntu环境下的安装配置;Git四大核心概念(工作区、暂存区、本地仓库、远程仓库)及其交互关系;常用Git命令及完整操作流程;代码回退、冲突解决等实用技巧;分支管理策略;以及GitFlow工作流在企业开发中的实际应用。文章通过具体命令示例和工作场景说明,帮助读者掌握从基础操作到团队协作的全套Git使用技能,特别适合开发者和团队管理者学习参考。
2025-07-09 23:54:54
670
原创 MySQL(七)事务隔离底层实现,锁和MVCC
MySQL事务隔离级别解析:锁机制与MVCC协同实现并发控制 MySQL通过四种事务隔离级别(RU、RC、RR、SER)解决并发问题,其核心实现依赖三大组件:锁机制(控制写冲突)、MVCC(实现无锁读)和UndoLog(保存历史版本)。锁机制包含行锁(索引记录加锁)、间隙锁(防止幻读)和意向锁(协调表锁与行锁)。MVCC通过ReadView和UndoLog版本链实现快照读,RC级别每次查询生成新快照解决脏读,RR级别固定快照解决不可重复读。隔离级别越高锁机制越复杂,需权衡隔离性与并发性能。
2025-07-03 07:00:00
1097
原创 MySQL(六)事务,ACID特性,隔离级别
事务是数据库操作的不可分割单元,确保操作要么全部成功,要么全部失败(原子性)。MySQL通过ACID特性保证数据可靠性:原子性(undolog实现回滚)、一致性(满足预设规则)、隔离性(MVCC和锁机制解决并发问题)、持久性(redolog确保数据永久保存)。MySQL默认采用可重复读隔离级别,平衡性能与一致性,通过MVCC和间隙锁解决大部分并发问题。实践中需避免长事务,可通过拆解事务、加锁等方式优化。事务机制是数据库稳定运行的核心保障,理解其原理对开发高性能应用至关重要。
2025-07-02 08:30:00
1102
原创 MySQL(五)索引的底层数据结构分析,B树,B+树,自适应哈希索引
在 MySQL 优化中,索引是提升查询性能的核心武器。但多数开发者只知 "建索引能加速查询",却不理解其底层数据结构如何影响性能。本文将从数据结构角度,详解 B 树、B + 树等索引的工作原理,揭示 "为什么索引能加速查询" 以及 "不同场景该选哪种索引" 的本质答案。
2025-07-01 08:30:00
1112
原创 MySQL (四):连接查询和索引
虽然两种方法结果一样,但是,在示例 1 中,MySQL 会在连接过程中直接过滤掉状态非 active 的客户,可能减少连接的数据量;这里的 “小表” 指的是。内连接的最终结果是 “两张表中匹配的记录”,因此当过滤条件只涉及其中一张表时(如只过滤 B 表),最左前缀原则和复合索引的顺序设计的要求都是因为查询子句中必须包含复合索引创建时的。,会先连接 A 和 B 的所有匹配记录,再从中间结果中删掉。)完成全量连接,生成临时的中间结果集,再对这个结果集应用。内连接是最常用的连接类型,它基于连接条件。
2025-06-30 14:53:57
1065
原创 MySQL (三):库操作、表操作、性能分析
批量操作:尽量使用批量插入、更新,减少 TCP 连接开销索引优化:为经常用于查询条件和排序的字段创建索引分页优化:大数据量分页使用主键限制替代偏移量避免回表:查询时尽量只选择需要的字段,避免SELECT *合理分组:优先使用WHERE过滤数据,避免分组后的HAVING操作禁用不必要排序:分组查询中不需要排序时使用通过以上优化方法,可以显著提高 MySQL 数据库的查询和操作性能,提升系统整体效率。
2025-06-28 13:16:50
960
原创 MySQL (二):范式设计
在 MySQL 数据库设计中,范式设计是构建高效、稳定数据库的关键环节。合理的范式设计能够减少数据冗余、消除操作异常,让数据组织更加规范和谐。然而,过度追求范式也可能带来多表联合查询效率降低的问题。本文将深入讲解第一范式(1NF)、第二范式(2NF)、第三范式(3NF)、BC 范式(BCNF)和第四范式(4NF) ,并结合案例分析其设计思路,探讨如何在范式设计与查询效率之间找到平衡。
2025-06-27 00:09:20
1355
1
原创 MySQL (一):数据类型,完整性约束和表间关系
关系型数据库是基于关系模型建立的数据库,以行和列的形式存储数据,通过表格之间的关联来表达数据之间的关系。常见的关系型数据库有 SQL Server、Oracle、DB2、MariaDB 等。以安卓系统中的 SQLite 为例,它是一款进程内数据库,常用于移动端应用的本地数据存储,轻量级且易于集成。与关系型数据库相对的是非关系型数据库,例如键值(k-v)存储的 Nosql、Redis,以及列式数据库 HBase 等。
2025-06-26 21:33:03
1137
原创 OpenCV C++图像金字塔和形态学操作
图像金字塔与形态学操作虽属于基础技术范畴,却在众多复杂任务中扮演着不可或缺的角色。图像金字塔通过构建多尺度图像表示,为图像的特征提取、目标检测与图像融合等任务提供了层次化的分析视角;而形态学操作则基于数学形态学理论,利用结构元素对图像进行处理,能够有效实现图像增强、噪声去除、形状分析与特征提取。
2025-06-22 08:30:00
1049
原创 OpenCV C++ 边缘检测与图像分割
在图像中,边缘可以看作是局部区域内像素灰度值的不连续性。从数学角度理解,灰度值的变化率在边缘处会出现显著变化。例如,在一幅黑白图像中,从黑色区域过渡到白色区域的边界处,像素灰度值会从较低值突然跃升至较高值,这个过渡区域就是边缘所在之处。
2025-06-20 08:30:00
1641
原创 OpenCV C++ 图像平滑和几何变换
在计算机视觉与数字图像处理领域,图像平滑与几何变换是构建复杂图像处理系统的基石。本文将深入剖析 OpenCV C++ 库中图像平滑与几何变换的核心技术。我们不仅会详细解读均值滤波、高斯滤波等平滑方法,以及平移、旋转、仿射变换和缩放等几何操作的原理与公式推导,还会结合具体的函数原型与示例代码,帮助读者快速上手实践。
2025-06-19 08:30:00
1024
原创 OpenCV C++ 图像处理教程:灰度变换与直方图分析
在数字图像处理领域,灰度变换与直方图分析是最基础且核心的技术,它们如同 “图像的化妆师”,能够通过调整像素灰度分布显著改善图像视觉效果,为后续的目标检测、图像分割等高级任务奠定基础。无论是校正图像的亮度与对比度,还是从低质量图像中提取有效信息,掌握这些技术都是图像处理从业者的必备技能。
2025-06-18 08:30:00
2336
原创 OpenCV C++ 图像处理模块 imgproc 详解
在计算机视觉领域,OpenCV 的图像处理模块imgproc(Image Processing)是开发者处理图像数据的核心工具集。它涵盖了从基础的颜色变换、图形绘制,到复杂的轮廓查找与分析等功能。本文将讲解imgproc模块中各个重要功能的使用方法与细节。
2025-06-17 11:25:14
997
原创 OpenCV C++ 核心模块 Core:Mat、Rect 与数组操作
在计算机视觉领域,OpenCV 是开发者们不可或缺的强大工具。而 OpenCV 的核心模块core,更是整个库的基石,它提供了基本的数据结构和算法,为后续复杂的图像处理与分析奠定了基础。本文将深入探讨core模块中最为关键的几个部分:Mat类、Rect类以及常用数组操作。
2025-06-17 08:30:00
1074
原创 手写muduo网络库(终):从实际案例出发详解muduo各模块间调用关系
在之前的系列文章中,我们已经详细探讨了手写 muduo 网络库各个模块的实现细节。然而,仅仅了解模块的实现逻辑是不够的,还需要深入理解各个模块之间的调用关系。本文将以一个回声服务器的代码编写为例,详细剖析 muduo 网络库各模块间的调用关系。通过模拟代码执行过程,深入探究连接建立、事件处理、回调函数设置与调用等关键环节,为读者揭示 muduo 底层原理。
2025-06-16 09:00:00
1367
原创 手写muduo网络库(十):TcpServer
TcpServer 类在 muduo 网络库中扮演着对外提供服务的重要角色,它封装了 TCP 服务器的基本功能,包括监听连接、处理新连接、管理连接生命周期等。本文将详细剖析 TcpServer 类的代码实现,深入探讨其功能和实现逻辑,并结合 C++ 语言特性进行讲解。
2025-06-16 08:30:00
1133
原创 手写muduo网络库(九):TcpConnection
在网络编程中,TCP 连接是非常重要的一部分。TcpConnection 类在 muduo 网络库中承担着管理单个 TCP 连接的重任,它封装了与 TCP 连接相关的各种操作,如数据的读写、连接的建立与销毁等。本文将详细剖析 TcpConnection 类的代码,深入探讨其功能和实现逻辑。
2025-06-15 08:30:00
1244
原创 手写muduo网络库(八):Buffer
在网络编程中,数据的读写是非常常见的操作。由于网络数据的收发往往是异步的,而且数据的大小和到达时间都是不确定的,因此需要一个缓冲区来暂存这些数据。Buffer 类就是为了解决这个问题而设计的,它提供了一个灵活的缓冲区管理机制,能够方便地处理数据的读写操作。在 muduo 网络库中,Buffer 类扮演着重要的角色,下面我们将详细讲解其功能和实现细节。
2025-06-13 08:30:00
1162
原创 手写muduo网络库(七):深入剖析 Acceptor 类
在网络编程中,服务器端程序需要能够监听客户端的连接请求并进行处理。Acceptor类在这个过程中扮演着至关重要的角色,它负责创建监听套接字、绑定地址、开始监听以及处理新的连接请求。在本文中,我们将详细剖析手写 muduo 网络库中的Acceptor类,探讨其实现原理和工作流程。
2025-06-12 17:03:07
999
原创 手写muduo网络库(六):地址和socket(inetAddress,Socket实现)
在网络编程的世界里,地址解析与 Socket 通信如同基础设施般支撑着整个网络应用的骨架。从 IP 地址与端口号的封装,到 Socket 文件描述符的管理与配置,每一个细节都关乎着数据传输的效率与稳定性。muduo 作为一款高效的 C++ 网络库,其对网络地址(InetAddress)和 Socket 操作(Socket类)的封装堪称经典 —— 既隐藏了底层系统调用的复杂性,又保留了对网络参数的精细控制能力。
2025-06-12 08:30:00
879
原创 手写muduo网络库(五):事件循环线程与线程池(Thread,EventLoopThread,EventLoopThreadPool实现)
muduo 网络库借助精心设计的线程池和事件循环机制,达成了高并发、高性能的网络编程目标。接下来,我们将深入探讨 muduo 网络库中的Thread、EventLoopThread和EventLoopThreadPool类的实现原理及代码细节。
2025-06-11 10:50:51
798
原创 手写muduo网络库(四):实现线程 ID 管理与事件循环并分析EventLoop,Poller,Channel关系
事件驱动架构中的Channel、Poller与EventLoop像是相互咬合的齿轮,它们共同构建了从底层 I/O 事件监听、事件分发到高层逻辑处理的完整链路。本文将深入剖析事件循环和这三个组件的交互机制 ,揭示 muduo 背后的设计思想。
2025-06-11 08:30:00
806
原创 手写muduo网络库(三):事件分发器(Poller,EPollPoller实现)
在网络编程里,高效处理多个 I/O 事件是关键。Muduo 网络库为我们提供了很好的解决方案,其中事件分发器(Poller)是核心组件之一。本文将详细剖析 muduo 网络库中事件分发器的实现,包含抽象基类 Poller 和具体实现类 EPollPoller,同时会解释 DefaultPoller 文件存在的意义。
2025-06-10 19:46:09
1007
原创 手写muduo网络库(二):文件描述符fd及其事件的封装(Channel类的实现)
在网络编程中,事件驱动是一种常见的编程模型。Muduo 网络库作为一个高效的 C++ 网络库,采用了事件驱动的设计思想。其中,Channel类在整个架构中扮演着非常重要的角色,它负责封装文件描述符(fd)和与之关联的事件,并处理这些事件的回调。本文将详细介绍 Muduo 网络库中的Channel类。
2025-06-10 19:12:37
828
原创 深入理解 C++ 左值右值、std::move 与函数重载中的参数传递
在 C++ 编程中,左值和右值的概念以及std::move的使用,常常让开发者感到困惑。特别是在函数重载场景下,如何合理利用这些特性来优化代码性能、确保语义正确,更是一个值得深入探讨的话题。
2025-06-09 00:36:42
1535
原创 手写muduo网络库(一):项目构建和时间戳、日志库
本文作为手写 muduo 网络库系列开篇,聚焦项目基础框架搭建与核心工具模块设计。通过解析 CMake 工程结构设计、目录规划原则,结合时间戳与日志系统的架构,为后续网络库开发奠定工程化基础。文中附完整 CMake 配置示例及模块代码。
2025-06-07 01:48:13
966
原创 手写muduo网络库(零):多线程中使用 weakptr 跨线程监听生命状态
在着手手写 muduo 网络库时,多线程编程中的对象生命周期管理是绕不开的关键技术点。std::weak_ptr作为 C++ 标准库的重要工具,能帮助我们在多线程环境下优雅、安全地监听对象生命状态,为网络库的稳定性和可靠性奠定基础。接下来,我们深入探讨这一前置知识,并结合实际场景,为手写 muduo 网络库做好技术储备。
2025-06-06 15:14:01
898
原创 select、poll、epoll 与 Reactor 模式
在高并发网络编程领域,高效处理大量连接和 I/O 事件是系统性能的关键。select、poll、epoll 作为 I/O 多路复用技术的代表,以及基于它们实现的 Reactor 模式,为开发者提供了强大的工具。本文将深入探讨这些技术的底层原理、优缺点。
2025-06-06 00:00:00
1394
1
原创 c++实现异步线程池并详细分析线程池析构流程
多线程编程是提高程序性能和响应能力的关键技术之一,异步线程池作为多线程编程的一种有效实现方式,能够管理和复用线程资源,避免频繁创建和销毁线程带来的开销。在本文中,我们将深入探讨如何实现一个异步线程池。
2025-06-05 03:03:57
1272
原创 多线程编程中的重要概念
在计算机科学领域,并行和并发是两个至关重要却又容易混淆的概念。理解它们的差异,对于编写高效的多线程程序以及合理利用系统资源有着深远意义。
2025-06-03 15:51:05
1107
原创 IO 中的阻塞、非阻塞、同步、异步及五种IO模型
本文深入解析了Linux系统中的五种I/O模型:阻塞I/O、非阻塞I/O、I/O多路复用、信号驱动I/O和异步I/O。文章首先阐述了I/O操作的两个关键阶段(数据准备和数据传输),并在此基础上比较了不同模型的特点、工作流程和适用场景。特别指出阻塞和非阻塞模式都属于同步I/O范畴,只有异步I/O才是真正的异步操作。通过分析各模型的实现机制和性能特点,为开发者在高并发场景下选择合适的I/O策略提供了理论依据。文章还区分了业务开发中的同步/异步概念与I/O模型的差异,帮助读者建立更全面的理解。
2025-05-29 00:00:00
2211
原创 TCP协议 与UDP协议
TCP(Transmission Control Protocol,传输控制协议)是 TCP/IP 协议族中的传输层协议,作为网络通信的 “可靠管家”,它基于 IP 协议提供面向连接、可靠有序、字节流传输服务。与 UDP 协议 “尽力而为” 的无连接传输不同,TCP 通过三次握手建立连接、四次挥手断开连接,配合复杂的可靠性保障机制,确保数据在复杂网络环境下准确无误传输,广泛应用于 HTTP、SMTP、FTP 等对数据完整性要求极高的场景。理解 TCP 协议的运行机制,需从其报文格式切入。
2025-05-28 10:00:00
1541
原创 Linux 系统内存地址映射(四):Linux 内核缺页异常处理机制源码分析
在前面的文章中,我们从理论层面深入探讨了 Linux 系统虚拟地址映射的基本原理和内核数据结构。本文将聚焦于内核源码,详细解析缺页异常处理的核心逻辑 ——do_page_fault()函数。通过分析这一关键函数,我们将揭示 Linux 内核如何处理内存访问缺失的情况,以及如何动态建立虚拟地址到物理地址的映射关系。
2025-05-28 00:15:00
1105
原创 32 位 Linux 系统内存地址映射(三):从系统内核源码看虚拟地址描述
在前面的文章中,我们深入探讨了 32 位 Linux 系统虚拟地址映射的基本原理,包括二级页表机制、虚拟内存管理以及用户空间与内核空间的地址映射差异。今天,让我们从 Linux 内核源码的角度,理解操作系统底层是如何管理虚拟内存的。
2025-05-27 10:00:00
2181
原创 32 位 Linux 系统内存地址映射(二):二级页表与用户 / 内核空间
在 32 位 Linux 系统中,虚拟地址映射是操作系统内存管理的核心机制。上一篇博客我们探讨了地址映射的基础知识,包括实模式与保护模式。本篇将深入聚焦二级页表映射、虚拟内存管理、交换分区机制,以及用户空间与内核空间地址映射的差异。
2025-05-27 06:00:00
952
原创 基于QT和FFmpeg实现自己的视频播放器FFMediaPlayer(二)——解封装器和解码器实现
本文基于FFmpeg实现了解封装器(FF_Demux)和解码器(FF_Decode)的核心功能。解封装器负责打开媒体文件、获取音视频流信息、读取数据包等功能,支持RTSP流和文件格式解析。解码器则实现了解码器初始化、数据包发送和帧接收功能,支持多线程解码。两个类都通过互斥锁保证线程安全,为后续开发视频播放器奠定了基础,后续还需处理音视频渲染和同步等问题。
2025-05-26 08:30:00
738
原创 32 位 Linux 系统内存地址映射(一):从实模式到保护模式
在计算机系统中,虚拟地址映射如同连接软件与硬件的桥梁,而 CPU 作为计算机的核心,其位数与架构设计深刻影响着地址映射的实现方式。从 8 位到 32 位 再到64位CPU 的演进,不仅是计算能力的提升,更是内存管理技术革新的驱动力。掌握 32 位系统地址映射,就如同手握打开内存管理奥秘的 “万能钥匙”,能为深入研究更复杂的 64 位系统奠定坚实基础。接下来,我们将深入探究 32 位 Linux 系统虚拟地址映射的底层架构与运行机制。
2025-05-26 01:04:20
1284
原创 基于 WebRTC 的一对一屏幕共享项目(三)——信令服务器
本文介绍了WebRTC一对一屏幕共享项目中信令服务器的关键实现。重点解析了自定义的RTCMap数据结构,它通过键值对存储方式高效管理房间和客户端信息,提供了put、get、remove等基本操作方法。文章详细阐述了完整的交互流程,包括客户端加入房间、SDP协商、ICE候选信息交换以及离开房间等环节的信令处理机制。信令服务器通过RTCMap维护房间状态,协调客户端间通信,确保WebRTC连接的顺利建立。该实现方案为开发实时通信应用提供了有效的信令管理参考。
2025-05-25 08:30:00
1234
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人