- 博客(86)
- 收藏
- 关注
原创 C++11—mutex
摘要:本文介绍了C++11中的std::mutex互斥锁机制,它是多线程编程中保护共享资源的基础同步原语。文章首先解释了互斥锁的必要性,通过银行取款场景类比说明其防止数据竞争、保证数据一致性和实现线程同步的作用。然后详细讲解了std::mutex的基本用法,包括手动加锁/解锁及其潜在风险(如死锁和异常安全问题)。最后重点推荐使用RAII机制的std::lock_guard来自动管理锁生命周期,确保异常安全,并介绍了adopt_lock的特殊用法。文中包含完整代码示例,展示了互斥锁的正确使用方式。
2026-01-12 02:09:28
990
原创 C++11—this_thread
std::this_thread是C++11标准库中用于操作当前线程的命名空间,提供四个核心函数:get_id()获取线程ID,yield()让出CPU时间片,sleep_for()休眠指定时长,sleep_until()休眠到指定时间点。这些函数无需线程对象即可直接调用,适用于线程识别、忙等待优化、定时任务等场景。使用时需注意线程ID重用、休眠精度等问题,合理选择函数以满足不同需求。
2026-01-12 00:40:34
763
原创 C++11—thread库
摘要 C++11的std::thread库提供了跨平台的线程管理功能,相比平台特定API更优雅易用。主要特点包括: 构造函数:支持函数、lambda、仿函数等多种可调用对象,可直接传递参数 移动语义:支持移动构造和移动赋值,但不允许拷贝 核心成员函数: join()等待线程完成,确保线程安全析构 线程对象必须是joinable状态(未join/detach)才能操作 优势:类型安全、参数传递简便、面向对象设计 使用std::thread需注意线程对象的生命周期管理,确保在析构前调用join或detach。
2026-01-11 22:50:49
873
原创 gflags 使用指南
gflags 是 Google 开发的 C++ 命令行参数解析库,支持通过命令行灵活调整程序行为而无需重新编译。其核心特点包括:一行代码定义参数、自动生成帮助文档、编译期类型检查、跨平台一致性以及灵活的扩展能力。gflags 采用全局状态管理标志,适合服务器程序、命令行工具等场景,但不适合需要动态参数扩展的情况。安装方式可选择包管理器(快速简便)或源码编译(获得最新版本)。相比其他参数解析库,gflags 在类型安全和自动文档生成方面具有优势。
2025-12-13 03:16:26
659
原创 深入浅出C语言——程序环境和预处理
C语言程序的编译链接过程分为翻译环境和执行环境两个阶段。翻译环境将源代码转换为可执行机器指令,包括预处理(宏展开、头文件插入)、编译(语法分析、生成汇编代码)、汇编(转换为机器码)和链接(合并目标文件、解析外部引用)四个步骤。执行环境则负责将程序载入内存并执行。通过理解这些过程,可以更好地编写和调试代码。预处理机制如宏定义、条件编译等,使代码更灵活易维护。
2025-12-10 00:37:23
741
原创 深入浅出C语言——文件操作
本文介绍了C语言文件操作的基础知识,重点讲解了文件的概念、文件指针和文件打开关闭操作。文章首先区分了程序文件和数据文件,解释了文件名结构和路径表示方法。然后详细阐述了文件指针(FILE*)的作用及其与文件的关系,提供了文件打开(fopen)和关闭(fclose)函数的用法说明,包括各种文件打开模式的区别和适用场景。最后给出了基本文件操作示例代码,强调了文件操作后指针置空的重要性。
2025-12-10 00:28:00
781
原创 深入浅出C语言——字符串和内存操作函数
C语言字符串和内存操作函数是编程基础,主要包括字符串长度计算(strlen)、拷贝(strcpy)、连接(strcat)和比较(strcmp)等函数。这些函数都定义在<string.h>中,使用时需要注意字符串必须以'\0'结尾,目标空间必须足够大且可修改。strlen返回无符号数size_t,比较时要注意类型转换;strcpy会复制整个字符串包括'\0';strcat将源字符串追加到目标字符串末尾;strcmp比较字符ASCII值而非长度。文中还提供了这些函数的模拟实现代码,帮助理解其工作原理
2025-12-10 00:20:05
582
原创 MSB3073错误分析
摘要: 在使用Qt和CMake开发时,MSB3073错误常因Q_OBJECT宏与AUTOMOC机制冲突导致,尤其是当包含该宏的类定义直接放在main.cpp中时。根本原因是moc生成的代码与主文件编译单元冲突,引发符号重复定义。解决方法是:将带有Q_OBJECT的类拆分为独立头文件(声明)和实现文件,并正确配置CMakeLists.txt启用AUTOMOC。这种分离结构符合Qt最佳实践,能避免构建错误,同时提升代码可维护性。关键原则:避免在含main()的文件中定义Q_OBJECT类。
2025-10-15 00:53:39
336
原创 RAII简介
想象你有个健忘的朋友,每次借东西都会忘记归还。RAII(ResourceAcquisitionIsI“你负责借,我负责还!核心逻辑出生即打工:对象在构造函数里获取资源(内存、文件、锁等)。去世前还债:对象在析构函数里自动释放资源。死也要还:即使程序中途崩溃(如抛异常),对象死前也会调用析构函数清理资源!👉本质资源的命,就是对象的命!对象活着,资源有效;对象去世,资源释放。懒人福音:资源获取释放全自动化,告别new/delete噩梦。异常克星:程序崩了也不留资源烂摊子。
2025-07-02 23:20:04
499
原创 Qt—模态与非模态对话框
文章摘要:Qt中的对话框分为模态和非模态两种类型。模态对话框强制用户优先处理当前窗口,阻塞特定范围的用户交互,分为应用级模态、窗口级模态和伪模态。应用级模态阻塞整个应用程序,窗口级模态仅阻塞父窗口及其子窗口,伪模态则允许后台代码继续执行。非模态对话框允许用户自由切换窗口,无交互阻塞。实现时需注意内存管理、UI响应性、模态类型选择和线程安全等问题。典型应用场景包括关键操作确认、局部配置、后台任务提示和工具面板等。
2025-05-19 23:23:04
1377
原创 双指针算法总结
环),也就是:left == right (两个指针指向同一个位置)left > right (两个指针错开)• 对撞指针从两端向中间移动。以个指针从最左端开始,另⼀个从最右端开始,然后逐渐往中间逼近。如果我们要研究的问题出现循环往复的情况时,均可考虑使快慢指针的思想。• 对撞指针的终止条件⼀般是两个指针相遇或者错开(也可能在循环内部找到结果直接跳出循。快慢指针又称为龟兔赛跑算法,其基本思想就是使用两个。常见的双指针有两种形式:对撞指针,左右指针。对撞指针一般用于顺序结构中,也称左右指针。
2023-09-05 15:35:46
380
原创 动态规划算法总结
对于动态规划问题,我将拆解为如下五步曲,这五步都搞清楚了,才能说把动态规划真的掌握了!找问题的最好方式就是把dp数组打印出来,看看究竟是不是按照自己思路推导的!做动规的题目,写代码之前一定要把状态转移在dp数组的上具体情况模拟一遍,心中有数,确定最后推出的是想要的结果。然后再写代码,如果代码没通过就打印dp数组,看看是不是和自己预先推导的哪里不一样。如果打印出来和自己预先模拟推导是一样的,那么就是自己的递归公式、初始化或者遍历顺序有问题了。如果和自己预先模拟推导的不一样,那么就是代码实现细节有问题。这样才是
2023-08-30 19:18:28
398
原创 深入浅出C++ ——线程库
在C++11之前,涉及到多线程问题,都是和平台相关的,比如windows和linux下各有自己的接口,这使得代码的可移植性比较差。C++11中最重要的特性就是对线程进行了支持,使得C++在并行编程时不需要依赖第三方库,而且在原子操作中还引入了原子类的概念。要使用标准库中的线程,必须包含< thread >头文件。常用函数函数名功能thread()构造一个线程对象,没有关联任何线程函数,即没有启动任何线程构造一个线程对象,并关联线程函数fn,args1,args2,…为线程函数的参数。
2023-07-20 20:50:19
551
原创 09.计算机网络——套接字编程
socket套接字通常指的是封装了ip和port的结构体,其是网络编程中的一种通信机制,支持TCP/IP的网络通信的基本操作单元,简单的说就是通信的两方的一种约定,用套接字中的相关函数来完成通信过程。sockaddr_in中的成员struct in_addr sin_addr表示32位 的IP 地址,但是我们通常用点分十进制的字符串表示IP 地址,以下函数可以在字符串表示 和in_addr表示之间转换。h表示host,n表示network,l表示32位长整数,s表示16位短整数。
2023-07-20 20:40:52
706
原创 08.计算机网络——其他重要协议和技术
代理服务器的作用:客户端向代理服务器发送请求, 代理服务器将请求转发给真正要请求的服务器; TCP/IP中使用IP地址和端口号来确定网络上的一台主机的一个程序,但是IP地址不方便记忆,于是人们发明域名,其本质是一个字符串,映射了它和IP地址的关系。 用户输入域名的时候, 会自动查询DNS服务器, 由DNS服务器检索数据库, 得到对应的IP地址。DNS是传输层采用UDP协议的应用层协议。 NAT是一种将私有IP和全局IP相互转化的技术方法,是解决IP地址不够用的主要手段,是路由器的一个重要功能。
2023-07-20 20:37:18
614
原创 07.计算机网络——数据链路层
双方在发送SYN的时候会在TCP头部写入自己能支持的MSS值,然后双方得知对方的MSS值之后, 选择较小的作为最终MSS,MSS的值在TCP首部的40字节变长选项中。 如果UDP在网络层分成多个IP数据报,这多个IP数据报有任意一个丢失, 都会引起接收端网络层重组失败. 那么这就意味着, 如果UDP数据报在网络层被分片, 整个数据被丢失的概率就大大增加了。 当进行网络通信的时候,源主机的应用程序知道目的主机的IP地址和端口号,却不知道目的主机的硬件地址。
2023-07-20 20:36:02
513
原创 06.计算机网络——IP协议
转发过程: 如果要发送的数据包的目的地址是192.168.56.3跟第一行的子网掩码做与运算得到192.168.56.0,与第一行的目的网络地址不符,再跟第二行的子网掩码做与运算得 到192.168.56.0,正是第二行的目的网络地址,因此从eth1接口发送出去。 路由是指:多台设备进行通信时,彼此之间发送具有IP特征的数据包,当数据包经过具备路由功能的设备时,设备进行解包并查看IP报文的目的网络地址,并于自身维护的路由表条目进行匹配,符合则进行转发,否则丢弃报文,回应网络不可达。
2023-07-20 20:34:24
820
原创 05.计算机网络——TCP协议
TCP协议——TCP全称为 “(Transmission Control Protocol)”,对数据的传输进行一个详细的控制。
2023-07-20 20:27:09
919
原创 JavaScript——基础知识及使用
JS 分成三个大的部分ECMAScript: 基础语法部分DOM API: 操作页面结构BOM API: 操作浏览器WebAPI 就包含了 DOM + BOM. 所谓的 API 本质上就是一些现成的函数/对象, 让程序猿拿来就用, 方便开发.相当于一个工具箱. 只不过程序猿用的工具箱数目繁多, 功能复杂.
2023-07-19 20:10:31
1401
原创 CSS——基础知识及使用
CSS是层叠样式表 (Cascading Style Sheets)的简写.CSS 能够对网页中元素位置的排版进行像素级精确控制, 实现美化页面的效果. 能够做到页面的样式和结构分离。
2023-07-19 20:04:28
1330
原创 HTML5——基础知识及使用
html 标签是整个 html 文件的根标签(最顶层标签).head 标签中写页面的属性.body 标签中写的是页面上显示的内容.title 标签中写的是页面的标题.HTML 标签HTML 代码是由 “标签” 构成的.例如:head 和 body 是 html 的子标签.html 是 head 和 body 的父标签.title 是 head 的子标签.head 是 title 的父标签.head 和 body 之间是兄弟关系.标签之间的结构关系, 构成了一个 DOM 树,DO
2023-07-19 19:57:54
2772
原创 04.MySQL——用户管理
初始化mysql_init()链接数据库设置链接的默认字符集是utf8,原始默认是latin1下发mysql命令读取结果该函数malloc了一片内存空间来存储查询过来的数据,所以一定要记的 free(result),不然是肯定会造成内存泄漏的。执行完mysql_store_result以后,数据都存放在MYSQL_RES 变量中。获取结果行数获取结果列数获取列名获取结果内容//按照行读取文件内容,自动更新行数。
2023-07-19 19:28:35
1136
原创 03.MySQL——索引和事务
mysqld本质是一个运行在OS上的进程。对MySQL数据进行操作本质上是对文件进行操作。任何的磁盘数据在进程中操作本质都必须在内存中进行。MySQL在启动的时候,会预先申请一部分内存空间,通过文件系统把文件load到缓冲区中。MySQL进行保存和IO的基本单位(Page)是16KB,OS管理内存的基本单位是4KB,磁盘设备的基本单位是512字节(扇区大小)。根据局部性原理,有很大概率能访问到预加载的数据,所以MySQL的IO交互是 Page相较于用多少,加载多少的方案而言可以提高效率。
2023-07-19 19:25:45
1108
原创 深入浅出C++——C++的IO流
“流”即是流动的意思,是物质从一处向另一处流动的过程,是对一种有序连续且具有方向性的数据的抽象描述。C++流是指信息从外部输入设备向计算机内部输入和从内存向外部输出设备输出的过程。这种输入输出的过程被形象的比喻为“流”。它的特性是:有序连续、具有方向性。为了实现这种流动,C++定义了I/O标准类库,这些每个类都称为流/流类,用以完成某方面的功能。C++标准库提供了4个全局流对象cin、cout、cerr、clog,使用cout进行标准输出,即数据从内存流向控制台。使用cin进行标准输入即数据通过键盘输入
2023-05-25 19:42:55
1053
原创 深入浅出C++——C++的类型转换
reinterpret_cast操作符通常为操作数的位模式提供较低层次的重新解释,用于将一种类型转换为另一种不同的类型,即类型转换为不相近的类型。编译器以为a不会改,把a放到了寄存器中,打印的时候去寄存器中拿,加volatile可以去掉编译器的优化,拿到内存中正确的值。为了弥补C语言类型转换的缺陷,C++提出了自己的类型转化风格,并且C++中还可以使用C语言的转化风格。向下转型:父类对象指针/引用->子类指针/引用(用dynamic_cast转型是安全的)类对象的指针或引用(动态转换)。
2023-05-25 19:40:41
1184
原创 深入浅出C++ ——智能指针
auto_ptr的实现是采用管理权转移的思想,在拷贝时(需要的就是浅拷贝,不能改为深拷贝),会导致被拷贝对象悬空,很多公司明确要求不要使用它。weak_ptr不是常规的智能指针,没有RAII,不支持直接管理资源,只用来解决循环引用问题,原理是weak_ptr的next和prev不会增加node1和node2的引用计数。C++11中开始提供更靠谱的unique_ptr ,unique_ptr的实现原理为简单粗暴的防拷贝,解决上述拷贝会出现的管理权转移问题。的shared_ptr。
2023-05-25 19:37:07
1267
原创 字符串和内存操作函数
本文总结了C语言中常用的字符串操作函数和字符操作函数。字符串操作部分包括:strlen(获取长度)、strcpy(字符串复制)、strcat(字符串连接)、strcmp(字符串比较)等基本函数及其模拟实现,以及strncpy、strncat、strncmp等带长度限制的变体函数,还介绍了strstr(子串查找)、strtok(字符串分割)和strerror(错误信息)等函数。字符操作部分列出了isspace、isdigit、isalpha等字符判断函数及其功能说明。文章对每个函数都给出了详细的参数说明和使用
2023-05-16 22:41:59
660
原创 C语言实现排序
文章摘要:本文介绍了常见的排序算法,包括冒泡排序、选择排序、插入排序、希尔排序、堆排序和快速排序。每种算法通过图示和代码示例详细说明了实现原理:冒泡排序通过相邻元素比较交换;选择排序每次选取最值元素;插入排序将元素插入有序序列;希尔排序采用分组预排序优化;堆排序利用大顶堆特性;快速排序基于基准值分割子序列递归排序。各算法均包含时间复杂度分析和稳定性说明,为不同场景下的排序需求提供参考。
2023-05-12 00:25:23
790
原创 深入浅出C++ ——线程库
在C++11之前,涉及到多线程问题,都是和平台相关的,比如windows和linux下各有自己的接口,这使得代码的可移植性比较差。C++11中最重要的特性就是对线程进行支持了,使得C++在并行编程时不需要依赖第三方库,而且在原子操作中还引入了原子类的概念。要使用标准库中的线程,必须包含< thread >头文件。常用函数函数名功能thread()构造一个线程对象,没有关联任何线程函数,即没有启动任何线程构造一个线程对象,并关联线程函数fn,args1,args2,…为线程函数的参数。
2023-05-05 15:05:40
561
原创 深入浅出C++ ——异常
实际使用中很多公司都会自定义自己的异常体系进行规范的异常管理,因为一个项目中如果大家随意抛异常,那么外层的调用者基本就没办法玩了,所以实际中都会定义一套继承的规范体系。这样大家抛出的都是继承的派生类对象捕获一个基类就可以了。} };return str;
2023-05-01 19:04:10
1156
原创 深入浅出C++ ——C++11
1998年是C++标准委员会成立的第一年,本来计划以后每5年视实际需要更新一次标准,C++国际标准委员会在研究C++ 03的下一个版本的时候,一开始计划是2007年发布,所以最初这个标准叫C++07。但是到06年的时候,官方觉得2007年肯定完不成C++ 07,而且官方觉得2008年可能也完不成。最后干脆叫C++0x。x的意思是不知道到底能在07还是08还是09年完成。结果2010年的时候也没完成,最后在2011年终于完成了C++标准。所以最终定名为C++11。
2023-05-01 18:03:10
6197
原创 深入浅出MySQL——CRUD
CRUD:语法:[ ]内的元素可以省略案例——创建一张学生表单行数据全列插入 value_list 数量必须和定义表的列的数量及顺序一致。多行数据指定列插入 value_list 数量必须和指定列数量及顺序一致。插入否则更新 由于主键或者唯一键对应的值已经存在而导致插入失败,可以选择性的进行同步更新操作,当导入的数据不存在时则进行添加,有修改时则进行更新。语法:ON DUPLICATE KEY 当发生重复key的时候,将原有的记录修改了案例:替换——REPLACE
2023-04-25 17:22:02
656
原创 01.MySQL——MySQL基础
数据库是数据库专家统一编写的数据库服务,该服务以mysqld的形式呈现,在磁盘上有大量的文件保存数据库和数据库内部的数据,把数据库服务端和数据库及其内部的数据统称为数据库。 总之,数据库是提供较为便捷的数据的存取服务的软件集合或解决方案
2023-04-24 17:36:24
667
原创 04.计算机网络——UDP协议
发送填充是将除了校验和的16位比特位,其余的按照16个比特位相加,在相加的过程中如果出现比特位超过16位的情况需要进行回卷,回卷的策略:最高位+低16位计算出来的新值。如果校验失败,即使数据已经到达了接收方传输层的UDP协议,也会被丢弃,有可能在传输的过程中失真。应用层交给UDP多长的报文,UDP原样发送,既不会拆分,也不会合并。当数据在应用层会被打上应用层的报头,在报头中会有数据的长度和两个标识,一个标识用来标识是否属于同一条数据,另一个标识用来标识当前数据在整个完整的数据的什么位置,相当于偏移量。
2023-04-18 14:27:17
855
原创 03.计算机网络——HTTPS协议
加密就是把明文(要传输的信息)进行一系列的变化生成密文。解密就是把密文再进行一系列变化,还原成明文。在这个解密和加密的过程中,往往都需要一个或者多个中间数据,辅助进行这个过程,这样的数据被称为密钥。数字指纹/数据摘要,其基本原理是利用单向散列函数(Hash函数)对信息进行运算,生成一串固定长度的数字摘要。它并不是⼀种加密机制,但可以用来判断数据有没有被窜改。
2023-04-17 22:45:11
409
原创 02.计算机网络——HTTP协议
应用层程序员写的一个个解决实际问题,基于socket接口之上编写的具体逻辑,满足我们日常需求的网络程序,都是在应用层。这些工作都是与文本处理相关的,所以http协议一定具有大量的文本分析和协议处理。协议协议是一种 “约定”,协议定义了在两个或多个通信实体之间交换的报文格式和次序,以及报文发送/报文接收或其他事件所采取的行动。socket api的接口在读写数据时,都是按 “字符串” 的方式来发送接收的。
2023-04-17 22:43:44
886
原创 01.计算机网络——网络基础
路由器接受到数据后,会拆掉数据链路层的MAC头部信息,将数据包送往网络层,路由器将检测数据包头部的目标IP地址信息,并根据该信息进行路由转发,将数据报文转发到下一路由器上,在转发前要重新封装新的MAC头部信息,并将数据转换成二进制。协议本质就是软件,软件是可以“分层”的,所以协议在设计的时候就是按照层状划分的。协议是双方约定同一种语言,进行沟通,计算机之间的传输媒介是光信号和电信号. 通过 “频率” 和 “强弱” 来表示 0 和 1 这样的信息. 要想传递各种不同的信息, 就需要约定好双方的数据格式。
2023-04-13 18:13:19
704
1
原创 Linux学习笔记——多线程
vm_area_struct 进程的虚拟地址空间中,堆分配的空间在逻辑地址上是连续的,但在物理地址上是不连续的。OS使用vm_area_struct结构体来细粒度划分进程中的堆区资源,vm_area_struct结构体中包含着标记位start和end,来描述堆空间,采用双链表来组织堆空间数据。页帧和页框 可执行程序就是一个文件,用户的可执行程序是按照地址空间的方式进行编译的,可执行程序按照区域被划分为了以4KB为单位的区域,这每4KB的区域称为一个页帧,物理内存每4KB的块称为一个页框。程序加载到物
2023-04-12 20:02:59
1780
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅