- 博客(24)
- 收藏
- 关注
原创 无锁编程-----atomic
核心说明:C++11 引入 std::atomic(头文件 <atomic>),目的是解决「多线程读写普通变量导致的数据混乱」,它能让变量的读写、修改操作变成“不可分割”的原子操作,无需手动加锁,就能保证多线程安全。也就是我们常说的无锁编程比如我们之前多线程用一个变量进行++的操作,从而导致数据不一致问题,我们会用锁来操作,但是我们学会atomic后,就可以不用锁来进行一些之前需要锁的操作从而用atomic代替#include <atomic> // atomic头文件,必须包含。
2026-05-14 18:56:02
18
原创 C++11语法之并发支持库(线程管理 | 同步与互斥部分中的std::mutex)
time_mutex跟mutex完全类似,只是额外提供try_lock_for和try_lock_untile的接口,这两个接口跟try_lock类似,只是他不会马上返回,而是直接进入阻塞,直到时间条件到了或者解锁了就会唤醒试图获取锁资源。lock_guard的功能简单纯粹,仅仅支持RAII的方式管理锁对象。,尝试对多个锁对象进行同时尝试锁定,如果全部锁对象都锁定了,返 回-1,如果某⼀个锁对象尝试锁定失败,把已经锁定成功的锁对象解锁,并则返回这个对象的下标 (第⼀个参数对象,下标从1开始算)。
2026-05-13 14:11:38
317
原创 C/C++的类型转换
本文系统介绍了C/C++中的类型转换机制。主要内容包括:1. C语言类型转换分为隐式(自动)和显式(强制)两种,前者由编译器自动完成,后者需程序员手动指定;2. C++在兼容C的基础上,增加了类类型转换支持,通过转换构造函数和operator Type()实现自定义类型与内置类型的互转;3. C++引入四种显式类型转换操作符(static_cast、reinterpret_cast、const_cast、dynamic_cast)以提高类型安全性;4. 详细分析了dynamic_cast依赖的RTTI机制及
2026-05-10 17:31:14
410
原创 论close()与signal(SIGPIPE,SIG_IGN)对服务器的重要性
也就是当我们客户端断开,但是我们服务端不小心给与该客户端建立的文件描述符通信时,我们OS会给服务端一个SIGPIPE信号,让其终止该进程。而我们用了该函数相当关于忽略了OS的信号,从而进程不会被终止,要知道我们一个服务器是希望可以长久运行的,不能轻易断开。在我们的四次挥手中,如果我们的客户端断开连接,但是在服务器处于CLOSE_WIAT状态,由于没有close,所以我们服务器会一直处于CLOSE_WAIT状态,从而导致资源一直在浪费,相当于内存泄漏。默认行为:直接杀死进程!
2026-04-29 21:48:18
140
原创 C++中论在类中成员变量定义顺序的重要性
今天,我在运行代码的时候,突然报出了一个错误,那就是,也就是段错误(核心转储)。相信大家大多碰见过这个错误。段错误(SIGSEGV)是程序试图访问非法内存地址时,操作系统强制终止程序并生成的崩溃报告。空指针 / 野指针访问:解引用了一个nullptr,或者访问了已经释放的内存。数组越界:访问了超出数组 / 缓冲区范围的内存。栈溢出:函数调用过深,或在栈上分配了过大的局部变量。多线程内存冲突:多个线程同时修改同一块未加锁保护的数据。
2026-04-28 21:24:51
56
原创 关于使用cpp的getline函数有时候遇到的常见错误(编程,竞赛都可能遇到)
C++中getline()函数使用指南 摘要:本文介绍了C++中getline()函数的基本用法及其与cin混用时常见的问题。getline()用于读取整行文本(包括空格),默认以换行符为分隔符,会自动清除缓冲区中的换行符。当getline()与cin混合使用时,cin留下的换行符会导致getline()立即读取空字符串。解决方案包括:1)使用cin.ignore()清除缓冲区;2)统一使用getline()读取所有输入,再通过stoi()转换数值类型。特别注意的是,连续使用getline()不会出现缓冲区
2026-04-25 17:13:43
25
原创 C++11之正则表达式使用指南--[正则表达式介绍]|[regex的常用函数等介绍]
():)[]?{n}{n,}{n,m}C++ 从C++11开始通过标准库<regex>提供正则表达式支持,涵盖匹配、搜索、替换和分组捕获等功能。我们可以平常工作用来匹配对应字符等等,其实竞赛感觉也可以用,因为我记得之前pta的题经常有这种非常恶心的匹配,替换的题目。
2026-03-29 16:17:42
419
原创 深入理解传输层协议之UDP[报文格式介绍 | 特点 | 缓冲区问题 | 应用场景]
按对UDP的数据进行管理的话,UDP有其发送缓冲区和接收缓冲区,因为要对UDP的数据进行上下层交付以及数据是否超载的管理,但是也可以说 "UDP没有真正意义上的发送缓冲区" (这里指的是由于UDP的特性:无连接、不可靠的协议,它。UDP 不会对应用层传入的数据做拆分、排序、重传处理,应用层给多少数据,UDP 就直接封装成报文发送,因此数据的分片、顺序控制、丢包重传,都需要应用层自行实现。,包含 8 字节的 UDP 首部 + 后面的数据部分,单位为字节,长度固定 16 比特。1. 实时音视频传输。
2026-03-24 23:28:29
352
原创 应用层的HTTP协议
什么是url?url指的是我们平常访问的网址,如下图注意:像我们这种www.qq.com之类的,是一个域名地址,通过域名服务器的DNS的转换才可以找到真正的服务器的ip地址(我们平常可能没买域名,就是直接http://127.0.0.1:8080这种ip+端口号+你后面带层次的文件路径就可以访问你服务器通过网络实现的程序),这里大多网址不会像图片一样会带端口号,因为用的是协议名默认的端口号,比如:tip:这种域名地址转ip地址,不止只有一个ip地址,不然万一比如抖音的一台服务器坏了,那么不就不能访问了。
2026-03-22 17:41:47
337
原创 应用层的自定义协议与序列化(粘包问题)
在我们的应用层中需要进行序列化与反序列化主要是Udp的特点是面向数据报,而Tcp的特点是面向字节流的。这就导致我们Udp每次发送都是将一个报文的内容完整的发送,但是Tcp不是,在用Tcp协议的服务端的发送缓冲区中,只要有数据了,就会发送。所以我们通信双方需要规定一个可以基于Tcp的字节流接收与发送的协议。于是就有了下面的话题序列化与反序列化Jsoncpp是一个纯cpp开源的的JSON库,专注实现JSON字符串 ↔ C++数据结构 的双向转换(序列化/反序列化),是C++处理JSON的主流选择。
2026-03-19 13:26:09
338
原创 网络基础---基建
在这个图中我们主机A发送消息,由于A、B、C、D、E五个主机都在局域网内,那么都会收到主机A的消息,只不过发现B、C、D发现不是发给自己的消息而丢弃掉了以太网中,任何时刻,只允许一台机器向网络中发送数据如果有多台同时发送,会发生数据干扰,我们称之为数据碰撞所有发送数据的主机要进行碰撞检测和碰撞避免没有交换机的情况下,一个以太网就是⼀个碰撞域局域网通信的过程中,主机对收到的报文确认是否是发给自己的,是通过目标mac地址判定。
2026-03-09 21:11:23
389
原创 用windows的Qt Creator里cout打印中文竟然会出现乱码,Liunx却不会,这是为啥?
所以由于我们QT用的源代码默认是UTF-8的格式,而我的控制台默认是GBK的格式,那么相当于我们编码最后是变成了UTF-8格式,但是控制台拿着GBK的表去解析,所以导致了乱码。今天在用Qt的时候,用cout打印中文,发现打印出来的是个乱码,问了ai才发现是编码方式不对,QT用的源代码默认是UTF-8的格式,而我的控制台默认是GBK的格式。我们的英文字母是用Ascii码来表示的,也就是一个字符对应一个整数,所以我们这里的GDK和UTF-8编码也是用一个大表格,一个字符对应一个整数。那么我们qt怎么解决?
2026-02-02 15:33:00
235
原创 linux之线程
本文系统介绍了操作系统中的线程、进程与同步机制。首先阐述了线程作为CPU调度基本单位的概念,对比了Linux和Windows的线程实现差异。随后详细讲解了资源划分机制(4KB页框)和多级页表原理。重点分析了线程与进程的优缺点,包括创建代价、切换开销和健壮性差异。在同步机制方面,深入探讨了互斥锁的原理与实现(硬件级中断屏蔽、软件级原子操作),以及条件变量的使用场景和生产者-消费者模型。最后介绍了POSIX信号量及其在环形队列中的应用,强调信号量P操作应置于加锁前的设计原则。
2026-01-16 10:23:56
616
原创 进程间通信
我们把从⼀个进程连接到另⼀个进程的⼀个数据流称为⼀个“管道”比如:管道通信的5种特性:1.匿名管道只能父子进程进行通信(一般是父子,因为如果子进程间通信会很麻烦,不如命名管道以及共享内存舒服)2.管道通信是面向字节流的3.管道文件自带同步机制写慢,读快----如果写端没有内容,那么读端就会阻塞,等待写端写入写快,读慢----如果管道满了的时候,写端就会进入阻塞状态,等待读端读取完毕写关,读继续----read就会返回0,表示文件结尾。
2025-11-19 18:40:17
838
原创 c++之多态篇
1.存在一个继承 hierarchy(层级结构),即父类和子类,子类对父类中定义的某些方法提供了自己的、不同的实现(即方法重写)2.必须通过基类的指针或者引用调用虚函数,因为只有基类的指针或引用才能既指向基类 对象又指向派⽣类对象(继承文章有提到)3.被调用的函数必须是虚函数,且派生类必须对基类的虚函数进行重写。
2025-11-08 17:20:40
817
原创 C++之继承---“继承遗产、创建别的产业公司”
本文系统介绍了面向对象编程中的继承机制。主要内容包括:1. 继承的基本概念,通过派生类复用基类代码,并详细说明了三种继承方式及其访问权限影响;2. 基类和派生类对象间的赋值转换规则,包括"切片"现象;3. 继承中的作用域问题,特别是同名成员的隐藏规则;4. 派生类构造/析构函数的调用顺序及注意事项;5. 友元和静态成员在继承中的特性;6. 重点分析了单继承、多继承和菱形继承问题,提出通过虚继承解决二义性;7. 最后比较了继承(is-a)和组合(has-a)的关系,建议优先使用组合降低耦合
2025-10-12 14:16:37
740
原创 c++模板知识
C++模板分为函数模板和类模板,它们类似于模具,能根据不同类型生成特定版本的函数或类。函数模板通过隐式或显式实例化自动推导类型,遵循优先匹配非模板函数的原则。类模板实例化时需要指定具体类型,支持全特化和偏特化。模板分离编译时可能出现链接错误,解决方法包括将定义放在头文件或进行显式实例化。模板特化(如函数模板特化和类模板全/偏特化)可用于特殊类型的定制处理。非类型模板参数允许使用常量值作为模板参数。
2025-10-10 18:47:54
876
原创 类与对象c++
比如:入学时填写的学生信息表,表格就可以看成是一个类,来描述具体学生信息。2、一个类可以实例化出多个对象,实例化出的对象 占用实际的物理空间,存储类成员变量。3、做个比方。类实例化出对象就像现实中使用建筑设计图建造出房子,
2025-10-03 15:34:06
621
原创 进程的概念
本文系统介绍了计算机进程相关知识,主要包括:1. 冯诺依曼体系结构及计算机硬件组成;2. 操作系统的核心功能和管理方式;3. 进程概念、状态及控制块(PCB);4. 进程创建(fork)、终止和等待(waitpid)机制;5. 进程地址空间和写时复制技术;6. 进程程序替换原理及函数接口;7. 简易shell的实现原理。文章通过代码示例和图示详细说明了进程管理的核心概念,包括父子进程关系、状态转换、地址空间映射等关键知识点,为理解操作系统进程管理提供了基础框架。
2025-09-24 15:34:12
931
原创 Linux文件权限理解
摘要: 文件权限通过角色(拥有者、所属组、其他用户)和属性(读r、写w、执行x)控制访问。权限由ll命令显示的10字符标识:首字符区分文件类型(如-普通文件,d目录),后9字符分三组对应角色权限。操作权限使用chmod(符号模式如u+x或数字模式如755),修改角色用chown/chgrp。umask决定新建文件/目录的默认权限(如022屏蔽组和其他用户的写权限)。粘滞位(如/tmp的t权限)限制目录内文件仅所有者、目录所有者或root可删除,确保共享目录安全。权限管理保障了系统安全与协作效率。
2025-08-25 20:29:51
1160
原创 Linux下的一些基本指令
绝对路径 (Absolute Path)定义: 从文件系统的根目录 (Root Directory) 开始,一路指向目标文件或目录的完整路径。它描述了文件或目录在文件系统层次结构中的绝对位置。特点:以根目录符号开头:Linux/macOS/Unix-like 系统: 以(斜杠) 开头。。唯一性: 在同一个文件系统中,一个文件或目录的绝对路径是唯一的。无论你当前在哪个目录下工作,相同的绝对路径都指向同一个位置。清晰明确:。
2025-08-19 22:40:25
694
原创 C++类与对象的前置小知识
一、缺省参数一、缺省参数该函数的参数已经全都赋予了初值同理,半缺省就是说在函数定义时,里面的参数不会都给赋初值,比如下面这个函数,这次变量a并没有给缺省值,而且要注意的是半缺省的参数必须从右往左给默认值,不能间隔给出,比如不能void txt_Season(int a=0,int b),因为这样编译器在函数调用的时候会出错,从编译器的角度来看:参数绑定是线性的(按从左到右的顺序去匹配)
2025-07-19 21:28:33
541
原创 LCA---倍增法(也许后续会出tarjan法)
首先我们需要fa[N][20],depth[N],p[N]数组,fa数组是用来倍增的,也就是存储该结点的祖先(包括它的父亲和爷爷),depth数组是存储当前结点的深度,我们把根节点的depth定为1,p数组用来模拟队列。比如这张图我要找9和10的祖先,那么先对齐深度,9结点变成5结点,那么发现这两个的父节点不相同,那么此时同步跳跃就发力了,他会将10结点和5结点同步跳跃,也就是每次执行他两深度不变,直到找到最近祖先2,那么就停止。
2025-03-22 10:13:01
347
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅