- 博客(434)
- 收藏
- 关注
原创 Web自动化测试入门:Selenium实现百度搜索自动化
自动化是指自动代替人的行为完成操作的过程。自动洒水机:通水后自动洒水并旋转自动洗手液:感应式自动出液,无需手动挤压超市自动闸门:无需手动开关门这些自动化应用有效减少了人力消耗,同时提高了生活质量和效率。软件中的自动化测试也具有类似优势,通过自动化测试能够有效减少人力的消耗,同时提高测试的质量和效率。Web自动化测试虽然需要一定的初期投入,但长期来看能够显著提高测试效率和软件质量。通过Selenium等成熟的测试框架,测试人员可以快速构建稳定可靠的自动化测试体系。
2026-02-14 19:47:14
550
原创 三种模型对比和reactor模式
特性selectpollepollReactor效率O(n)扫描O(n)扫描O(1)事件通知事件驱动连接数有限制(1024)无限制无限制无限制内存拷贝每次调用都要拷贝需要遍历内存共享封装了epoll触发模式水平触发水平触发水平/边缘触发可配置编程复杂度简单简单中等较高但结构清晰Reactor模式核心思想事件分离:将事件检测和事件处理分离事件分发:将事件分发给对应的处理器非阻塞I/O:使用非阻塞I/O模型单线程/多线程。
2026-02-09 23:05:21
191
原创 网络编程框架笔记
OK = 0, // 正常USAGE_ERR, // 使用错误SOCKET_ERR, // socket创建失败BIND_ERR, // bind失败LISTEN_ERR, // listen失败CONNECT_ERR, // connect失败FORK_ERR // fork失败#define CONV(addr) ((struct sockaddr*)&addr) // sockaddr_in转sockaddr*private:// 网络地址结构// 字符串格式IP// 端口号。
2026-02-09 22:45:42
490
1
原创 C++11实现线程池
线程安全:使用互斥锁保护共享资源任务队列:FIFO 顺序执行任务条件变量:高效等待任务优雅关闭:析构时等待所有任务完成异常安全:任务异常不会影响线程池通用接口:支持任意可调用对象返回结果:通过获取任务结果。
2026-02-08 15:03:23
491
原创 C++11 异步编程入门教程
C++11 引入了<future>头文件,提供了一套标准化的异步编程工具,用于简化多线程编程和异步任务管理。这套工具主要包括std::async等组件。: 最基本的异步结果传递机制async: 最简单的异步任务启动方式: 包装可调用对象,便于线程池使用: 支持多个消费者共享结果: 用于非阻塞的状态检查这套工具使得 C++ 异步编程更加标准化和安全,避免了直接操作线程和锁的复杂性。
2026-02-08 14:46:57
479
原创 C++11 异步编程入门教程
C++11 引入了<future>头文件,提供了一套强大的异步编程工具。这些工具允许你轻松地编写并发代码,而无需直接管理线程。本教程将详细介绍futureasynclaunchpromise和的使用方法。future: 获取异步结果的主要接口: 可共享的 future,用于多线程场景async: 启动异步任务的便捷方式promise: 手动设置结果值: 包装函数对象,自动管理结果传递: 检查异步操作状态的工具掌握这些工具可以让你编写出更安全、更高效的并发代码!
2026-02-07 17:17:18
239
原创 介绍一下ref
为什么必须用std::ref()线程参数必须可拷贝:系统线程API要求参数能打包传递引用不是对象:引用本身不能单独存在,必须绑定到对象std::ref创建可拷贝的引用包装器:它存储原对象的指针,可以安全拷贝隐式转换机制:在需要时自动转换回真正的引用简单情况:优先使用lambda捕获,更直观安全复杂情况:使用std::ref()显式传递引用避免错误:永远不要直接传递引用给线程构造函数理解了这一机制,你就能避免很多多线程编程中的隐蔽bug!
2026-02-07 17:12:29
358
原创 C++11 并发支持库核心知识详解
C++11 标准引入了强大的多线程支持库,使得编写跨平台并发程序变得更加简单和安全。本文假设你已经具备进程/线程的基础知识,将重点讲解C++11并发库的使用方法。优先使用RAII:多用lock_guard,避免手动锁管理原子操作优先:简单计数器等场景优先使用atomic条件变量配合谓词:总是使用谓词避免虚假唤醒线程安全传参:引用传参使用std::ref()资源释放:确保所有线程正确join或detach异常安全:使用RAII确保异常时资源正确释放。
2026-02-07 17:07:50
527
原创 C++11函数包装器:function与bind深度解析
C++11的和std::bind为函数式编程风格提供了强大的支持。它们使得代码更加灵活和可复用,特别是在需要处理多种可调用对象或进行参数绑定的场景中。提供了统一的类型接口,使得不同类型的可调用对象可以以一致的方式使用。而std::bind则提供了强大的参数绑定能力,可以创建新的函数对象。在实际开发中,要根据具体需求选择合适的工具,并注意相关的性能影响和最佳实践。这两个工具的正确使用可以显著提高代码的质量和可维护性。通过本文的介绍和示例,希望读者能够掌握function和bind。
2026-02-07 15:07:14
409
原创 线程睡眠 vs CPU消耗,以及Join vs Wait的区别
线程间关系:一个线程等待另一个线程生命周期管理:确保线程资源被正确回收一次性操作:每个线程只能被join一次获取结果:可以获取线程函数的返回值。
2026-02-06 18:25:27
410
原创 多线程编程的“幽灵”:数据不一致问题与互斥锁的终极解决方案
多线程编程就像指挥一个交响乐团,每个乐器(线程)都需要精确协调才能演奏出和谐的乐章。互斥锁就是我们手中的指挥棒,确保每个声部在正确的时间发声。理解数据不一致的根本原因,掌握互斥锁的正确使用,是多线程编程从入门到精通的关键一步。记住:在并发世界里,没有免费的线程安全。每一次性能的提升,都需要我们对共享状态进行精心的管理和保护。
2026-02-06 15:01:13
480
原创 递归和迭代的区别(C/C++实现)
在C/C++中,递归和迭代是解决问题的两种不同思维方式:递归更符合某些问题的自然结构,但可能有性能问题迭代通常更高效,但代码可能不够直观实际开发中应根据具体需求、性能要求和代码可维护性来选择。
2026-02-05 13:41:56
481
原创 C语言字符串与内存操作函数模拟实现详解
函数操作对象返回类型主要用途strstr字符串char*查找子串memcpy内存块void*非重叠内存拷贝memmove内存块void*任意内存拷贝(含重叠)
2026-02-03 20:42:01
608
原创 笔试真题训练
从 n×m 网格左上角出发,只能向右或向下走,每个格子有一个小写字母。字母 l、o、v、e 分别对应 4、3、2、1 分,其他字母 0 分。求从左上到右下的路径最大得分。:先排序,然后遍历数组统计连续序列的长度。注意处理重复值和空数组。:给定无序数组,求值连续(位置可不连续)的最长子序列的长度。:给定两个正整数 a, b,求它们的最小公倍数。为最大公约数,可用辗转相除法计算。根据字母映射分值,注意边界处理。
2026-02-03 15:52:49
214
原创 MySQL核心知识梳理:从连接到查询的完整指南
MySQL是一个功能强大、应用广泛的关系型数据库管理系统。基础操作:数据库的创建、表的定义、数据的CRUD约束管理:主键、外键、唯一、非空等约束的使用查询技巧:单表查询、多表连接、排序分组数据完整性:通过各种约束保证数据质量性能优化:基本的查询优化和设计原则记住,良好的数据库设计是应用成功的基础。始终从业务需求出发,合理设计表结构,建立必要的约束,才能构建出稳定、高效的数据存储系统。
2026-02-02 17:12:15
553
原创 MySQL视图详解:虚拟表的创建、使用与实战
视图是一个虚拟表,其内容由一个查询(SELECT语句)来定义。与真实的物理表一样,视图也由一系列命名的列和行数据组成。核心特性虚拟性:视图并不在数据库中实际存储数据,它保存的是查询逻辑。当你从视图中查询数据时,数据库引擎会实时执行定义视图的SELECT语句。相互影响:视图的数据来源于一个或多个基表(真实表)。因此,对视图数据的修改(如INSERTUPDATEDELETE)通常会影响到基表。同样,基表数据的更改也会实时反映在基于它创建的视图中。特性描述本质基于SELECT查询的虚拟表优点。
2026-02-02 17:06:05
272
原创 MySQL事务深度解析:从ACID特性到MVCC实现
事务是由一组DML(数据操作语言)语句组成的逻辑单元。这个单元内的所有语句作为一个整体,要么全部成功执行(提交,Commit),要么全部失败回滚(Rollback)。一个典型的事务例子是删除一个学生的所有信息:这需要删除基本信息表、成绩表、活动记录表等多张表中的数据。这些操作必须作为一个事务,否则如果只删除了部分信息,数据库就会处于不一致的状态。事务是保障数据库一致性的关键,ACID是它的核心特性。隔离级别是并发控制和数据安全的权衡。MySQL默认的可重复读。
2026-02-02 17:02:03
638
原创 MySQL索引深度解析:从原理到实践
链表:查询效率O(n),无法接受。二叉搜索树:可能退化成链表。AVL/红黑树:虽然是平衡树,但它是二叉树,树高太高(log₂n),导致IO次数多于B+树(logₘn, m>>2)。Hash:等值查询快(O(1)),但不支持范围查询,这是其致命弱点。B树:B树的节点既存数据又存指针。相比之下,B+树非叶子节点不存数据,因此能容纳更多关键字,树更矮。且B+树叶子的链表结构非常适合范围查询。索引是MySQL性能优化的基石。
2026-02-02 16:51:40
647
原创 MySQL表的内连接与外连接详解
外连接分为左外连接和右外连接,用于显示不匹配的记录。连接类型语法结果描述使用场景内连接INNER JOIN只返回两个表匹配的记录需要完全匹配的数据左外连接LEFT JOIN返回左表全部+右表匹配记录需要显示主表所有记录右外连接RIGHT JOIN返回右表全部+左表匹配记录需要显示从表所有记录内连接:求交集,最常用左外连接:保留左表全部记录右外连接:保留右表全部记录实际开发中根据业务需求选择合适的连接方式。
2026-02-01 21:23:35
307
原创 MySQL复合查询详解:多表查询、子查询与合并查询
场景推荐查询方式理由简单单表查询基本SELECT性能最好多表关联查询多表连接直观易懂层次关系查询自连接性能优于子查询存在性检查EXISTS子查询效率高结果集合并根据去重需求选择。
2026-02-01 20:01:00
464
原创 MySQL函数详解:日期、字符串、数学及其他常用函数
返回substring在string中出现的位置,没有返回0。在str中用replace_str替换search_str。从string2中的左边起取length个字符。:在大量数据时避免在WHERE条件中使用函数。:时间计算、日期格式化、时间段查询。:中文字符串处理要特别注意长度计算。:不同数据库系统的函数可能有差异。计算两个日期的差值(单位:天):拼接、替换、截取、格式化显示。:类型转换、进制转换、编码处理。在date中添加日期或时间。在date中减去日期或时间。:空值处理、条件表达式。
2026-02-01 16:14:36
345
原创 MySQL表的增删改查(CRUD)操作详解
Create(创建) - 插入数据Retrieve(读取) - 查询数据Update(更新) - 更新数据Delete(删除) - 删除数据。
2026-02-01 15:49:58
724
原创 MySQL表的约束详解
约束是保证数据完整性和业务逻辑正确性的重要手段。MySQL提供了多种约束类型来限制字段数据的合法性。保证数据完整性:NOT NULL、主键、外键提高数据质量:唯一键、检查约束增强可读性:COMMENT描述简化操作:DEFAULT默认值维护关联关系:外键约束正确使用约束能够在数据库层面就杜绝大部分的数据异常,是数据库设计中的重要环节。
2026-02-01 00:45:53
397
原创 MySQL数据类型详解
尽量不使用unsigned,int放不下的数据int unsigned也可能放不下,应直接升级为bigint。:根据数据范围选择合适的类型,避免过度使用UNSIGNED。:定长数据用CHAR,变长数据用VARCHAR。:需要自动更新时间时使用TIMESTAMP。实际存储为数字(1,2,4,8,...):避免直接使用数字值,不利于代码可读性。实际存储为数字(1,2,3,...)适合存储布尔值(0/1),节省空间。:对精度要求高时使用DECIMAL。:精度要求高时选择DECIMAL。
2026-02-01 00:40:58
696
原创 MySQL数据表操作全解析:从创建到管理
掌握MySQL表的基本操作是数据库管理的核心技能。从创建表时的存储引擎选择,到日常的表维护操作,每一步都需要谨慎考虑。特别是修改表结构时,要充分评估对现有业务的影响,做好数据备份,确保操作的安全性和稳定性。通过本文的学习,你应该能够熟练进行表的创建、查看、修改和删除等基本操作,为后续的数据管理和查询打下坚实基础。
2026-01-30 22:39:00
415
原创 数据库中对库的操作
掌握对数据库本身的操作是管理MySQL的基石。从创建时考虑字符集,到日常的维护、备份,每一步都关系到数据的完整性和安全性。理解校验规则对查询和排序的深层影响,更能让你在开发中避免很多隐蔽的坑。在MySQL的学习中,对数据库(Database)本身的操作是第一步,也是最基础且关键的一步。本文将系统性地介绍如何创建、查看、修改、删除数据库,并深入讲解字符集与校验规则的影响。:在创建数据库时,根据业务需求选择合适的字符集和校验规则至关重要。删除数据库会同时删除数据库内的所有表和数据,且不可恢复,请务必谨慎!
2026-01-30 22:16:22
790
原创 对于数据库基本认识
支持多平台安装(如CentOS 6/7、Windows),提供多种安装方式(如yum、二进制包)。:文件存储数据存在安全性低、查询管理不便、不支持海量数据、程序控制困难等问题。:最受欢迎的数据库,并发性好,适合电商、论坛等简单业务场景。理解数据库的层次结构(服务器-数据库-表)是后续操作的基础。:更有效、安全地管理数据,是衡量程序员水平的重要指标。数据库解决了文件存储的缺陷,提供高效、安全的数据管理。:轻量级嵌入式数据库,资源占用低,适合嵌入式设备。:存储在数据库中,用于保存实体数据(如学生信息)。
2026-01-30 16:52:35
561
原创 图的相关知识点总结
图的结构灵活,可建模复杂关系。存储与遍历是基础,DFS/BFS需熟练掌握。最小生成树与最短路径是经典问题,需根据图特性选择算法。拓扑排序用于DAG的依赖解析,负环判断是关键难点。实际应用中需结合问题规模、边权正负、稠密性等因素选择算法。
2026-01-29 20:39:32
583
原创 JMeter性能测试工具核心面试复习指南
Apache JMeter 是一个基于 Java 的开源压力测试工具,主要用于对软件进行性能测试。Java 8 或更高版本。安装:直接下载压缩包(tar/zip),解压即可。启动(两种方式):直接运行:双击 目录下的 (Windows) 或 (Unix/Linux)。命令行启动(推荐):将 JMeter 的 目录添加到系统环境变量 中,然后在命令行直接输入 。修改 文件,找到 配置项,改为 ,重启 JMeter。核心原则:元件对其子节点生效。执行顺序:配置元件(Configuration Elements)
2026-01-27 21:15:34
673
原创 Vector(顺序表)详解
线性表是n个具有相同特性的数据元素的有序序列逻辑上呈现为连续的线段结构动态扩容,内存使用更合理提供丰富的接口,使用方便支持随机访问,效率高。
2026-01-20 17:34:44
377
原创 字节跳动面经
vector 是内存连续的线性结构,支持随机访问,插入/删除(非末尾)效率低(需移动元素)。list 是内存不连续的链表结构,不支持随机访问,但任意位置插入/删除效率高(O(1))。:编译期转换,用于相关类型(如数值类型、基类转派生类),不进行运行时检查。:运行期检查,用于多态类型(需虚函数),安全向下转换,失败返回。线程切换开销小(仅保存寄存器),进程切换需更新页表等,开销大。:线程未获锁时循环尝试(忙等),不挂起,适合短时间等待。:基于哈希表,平均 O(1),无序,需处理哈希冲突。
2026-01-20 16:09:38
791
原创 二叉搜索树,平衡二叉树,红黑树总结
特性二叉搜索树 (BST)平衡二叉树 (AVL)红黑树 (RBT)平衡性无保证,可能退化为链表严格平衡(高度差≤1)近似平衡(路径差≤2倍)操作效率最好 O(log N),最坏 O(N)稳定 O(log N)稳定 O(log N)维护成本无额外操作旋转频率高,适合查询多、修改少的场景旋转次数少,适合频繁增删的场景应用场景简单数据管理数据库索引、需要快速查询的场景标准库容器(如 C++ STL map/set)、文件系统演进关系二叉搜索树。
2026-01-19 18:50:09
443
原创 存储过程和触发器的总结
SELECT 列名 INTO @var_name FROM 表名;DECLARE 变量名 变量类型 [DEFAULT 默认值];statement-- 示例:处理游标越界触发器是与表关联的数据库对象,在对表进行INSERT、UPDATE、DELETE操作时自动执行预定义的SQL语句。
2026-01-19 10:06:55
444
原创 博客标题:深入理解Shell:从进程控制到自主实现一个微型Shell
通过实现一个简单的Shell,我们不仅加深了对进程控制(forkexecwait)的理解,也直观感受到了Shell的工作原理。虽然这个微型Shell功能有限,但它揭示了操作系统与用户交互的核心机制。下一步:尝试为你的Shell添加更多功能,如管道、重定向、后台运行等,逐步打造一个功能完整的Shell!
2026-01-08 22:55:54
341
原创 深入理解进程控制:退出、等待与替换
将进程创建(fork)、进程等待(waitpid)和进程替换(exec)结合起来,就能理解Shell的工作原理。获取命令行:显示提示符,读取用户输入的命令。解析命令行:将命令字符串解析为命令名和参数列表。创建子进程:使用fork。子进程程序替换:在子进程中使用execvp执行命令。父进程等待子进程退出:使用waitpid等待子进程结束,防止其变成僵尸进程。这个过程完美体现了“调用/返回” 的对称性:在函数中,call调用函数,函数return返回。在进程间,fork创建子进程,子进程exec。
2026-01-03 23:10:33
815
原创 深入理解Linux环境变量:从命令行到C程序实战
提供运行环境配置:通过环境变量,程序可以获取运行所需的各种配置信息实现配置与代码分离:将配置信息从代码中抽离,提高代码的可维护性和可移植性支持多环境部署:通过不同的环境变量值,同一份代码可以在开发、测试、生产等不同环境中运行便于自动化运维:在CI/CD流程中,可以通过环境变量传递构建和部署参数掌握环境变量的使用,是Linux开发和运维的基础技能。建议在实际开发中多使用环境变量来管理配置,养成良好的编程习惯。export:简单易用,适合设置普通字符串环境变量declare -x。
2025-12-31 13:55:21
790
原创 Linux 下的代码侦探:gdb 调试器从入门到实战
gdb 是 Linux 开发者必须掌握的强大工具。从基本的启动、设置断点、单步执行,到高级的监视点、条件断点、变量修改,它提供了一套完整的方案来帮助我们深入程序内部,精准定位和解决问题。编译时加-g-> 启动 gdb -> 设断点 (b) -> 运行 (r) -> 单步/继续 (n/s/c) -> 查看状态 () -> 分析修改 -> 解决问题。多动手实践,你就能熟练运用这位“代码侦探”,让调试工作变得事半功倍。命令核心作用适用场景输出示例p expr实时计算/查看值1. 查看变量当前值。
2025-12-28 17:01:37
1024
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅