- 博客(57)
- 收藏
- 关注
原创 Linux系统编程 | 常见锁概念&&死锁问题
读写锁作为一种特殊的锁机制,把对共享资源的操作,明确划分为读操作和写操作。允许多个线程同时进行读操作,因为读操作不会修改共享资源,所以不会产生数据不一致的问题;但只允许一个线程进行写操作,并且在写操作进行时,不允许其他线程进行读或写操作,以此保证共享资源的一致性。在多个线程尝试获取锁时,它们会持续自旋(即在一个循环中不断检查锁是否可用)而不是立即进入休眠状态等待锁的释放。死锁是指在⼀组进程中的各个进程均占有不会释放的资源,但因互相申请被其他进程所站⽤不会释放的资源⽽处于的⼀种永久等待状态。
2025-04-29 09:12:46
801
原创 设计模式 | 详解常用设计模式(六大设计原则,单例模式,工厂模式,建造者模式,代理模式)
设计模式是前辈们总结出的开发经验,是一系列用来解决特定问题的套路。它不是语法规范,而是帮助我们提升代码复用性、可维护性、可读性、稳健性以及安全性的一套方案。设计模式提供了一种优化代码的方式,通过标准化、模块化的设计,能够帮助我们提高系统的可维护性、可扩展性和可复用性。掌握这些设计模式和原则,将有助于开发高质量的代码,并且在实际开发中轻松应对复杂问题。🎯掌握设计模式= 更加优雅、灵活的编程!
2025-04-29 09:04:47
937
原创 计算机网络 | 应用层(6) -- 套接字编程
💓本博客内容为《计算机网络:自顶向下方法》第二章应用层第七节知识梳理关注我🌹,和我一起学习更多计算机的知识~🔝🔝🔝。
2025-04-27 18:18:09
1117
原创 计算机网络应用层(5)-- P2P文件分发&视频流和内容分发网
💓本博客内容为《计算机网络:自顶向下方法》第二章应用层第五、六节知识梳理关注我🌹,和我一起学习更多计算机的知识~🔝🔝🔝。
2025-04-27 18:15:07
1506
原创 计算机网络 | 应用层(2)-- Web 与 HTTP 协议
Web 页面(Webpage,也叫文档)由对象组成。一个对象(object)就是一个文件,可通过 URL 地址进行寻址。多数 Web 页面包含一个 HTML 基本文件(base HTML file)以及若干引用对象,HTML 基本文件通过对象的 URL 地址引用页面中的其他对象。每个 URL 地址由两部分构成:存放对象的服务器主机名和对象的路径名。例如:是主机名是路径名。
2025-04-26 22:27:08
1220
原创 计算机网络 | 应用层(4)--DNS:因特网的目录服务
单点故障(a single point of failure):一旦中心服务器出现故障,整个域名解析服务将瘫痪。通信容量(traffic volume):大量的域名解析请求集中到一台服务器,容易造成网络拥塞和服务器负载过高。远距离的集中式数据库(distant centralized database):数据存储在单一位置,对于距离较远的用户,访问效率低。维护(maintenance):数据更新、服务器维护等操作复杂,成本高。
2025-04-26 22:22:51
1220
原创 计算机网络 | 应用层(1)--应用层协议原理
Web 页面(Webpage,也叫文档)由对象组成。一个对象(object)就是一个文件,可通过 URL 地址进行寻址。多数 Web 页面包含一个 HTML 基本文件(base HTML file)以及若干引用对象,HTML 基本文件通过对象的 URL 地址引用页面中的其他对象。每个 URL 地址由两部分构成:存放对象的服务器主机名和对象的路径名。例如:是主机名是路径名。
2025-04-26 22:13:20
1151
原创 Linux疑难杂惑 | 云服务器重装系统后vscode无法远程连接的问题
文件记录服务器信息与现服务器的信息冲突了,导致连接失败。文件,把里面的所有东西删除后保存就好了。解决方法:找到本地的。
2025-04-19 15:48:13
366
原创 Linux系统 | 线程的同步与互斥
互斥保证有且只有一个执行流进入临界区,访问临界资源,通常对临界资源起保护作用。所谓同步,在保证数据安全的前提下,让线程能够按照某种特定的顺序访问临界资源,从而有效避免饥饿问题e.g.「操作 A 应在操作 B 之前执行」,「操作 C 必须在操作 A 和操作 B 都完成之后才能执行」
2025-03-28 21:29:13
691
原创 Linux系统编程 | 线程的基本概念
程序中的一个执行路线就叫做线程一个进程至少要有一个执行线程,单个进程本身就是一个执行流,所以单个进程某种意义上也是一个线程(是主线程).线程在进程内部运行,本质是在进程地址空间内运行在Linux操作系统下,线程就是轻量化进程,线程是没有独立的地址空间的PCN结构,线程的资源是主线程共享给它们的。!
2025-03-28 21:21:56
1029
原创 c++11 | 细说智能指针
智能指针是 C++ 中一种用于管理动态内存的机制。它提供了一种更安全、更方便的方式来处理对象的生命周期,自动释放不再需要的内存,从而避免内存泄漏和悬空指针等问题。
2025-03-24 23:18:00
722
原创 Linux系统编程 | 信号的基本概念与产生
信号本质是一种通知机制用户或操作系统可通过发送信号通知进程某些事件已发生,让进程后续进行处理。信号的产生,相对于进程的进行,是异步的。我们可以通过生活中的信号进行类比理解。生活中的信号,是闹钟,将人从睡眠状态唤醒;是快递到站通知,通知你去快递站取快递;是敲门声,通知你开门…一言概之,信号中断人正在做的事情。什么是同步?什么是异步?同步:就像一群人排队依次通过安检,每个人都要等前面的人完成安检后才能前进,大家的行动是依次进行、相互等待的,这就是同步,在这个过程中每个环节是。
2025-03-10 16:21:41
1045
原创 C++疑难杂症 | 切片问题
对象切片(Object Slicing)是 C++ 中一个重要的概念,当一个派生类对象被赋值给一个基类对象时,只有基类部分的数据会被复制,而派生类特有的数据成员会被“切掉”,这可能导致意外的行为和数据丢失。
2024-12-25 23:19:28
400
原创 LINUX | git的使用
为了能够更⽅便我们管理这些不同版本的⽂件,便有了版本控制器。所谓的版本控制器,就是能让你 了解到⼀个⽂件的历史,以及它的发展过程的系统。通俗的讲就是⼀个可以记录⼯程的每⼀次改动和 版本迭代的⼀个管理系统,同时也⽅便多⼈协同作业。对于开发⼈员来说,Git 最重要的就是可以帮助我们管理软件开发项⽬中的源代码⽂件!需要填⼊⽤⼾名密码. 同步成功后, 刷新 Github/gitee ⻚⾯就能看到代码改动了。提交的时候应该注明提交⽇志, 描述改动的详细内容.你可以到gitee上去复制对应代码,粘贴过去执行。
2024-12-07 20:00:49
310
原创 C++11|std::move和std::forward的区别
std::move和是C++11中引入的两个模板函数,它们在C++的类型推导和完美转发中扮演着重要的角色。
2024-11-05 21:37:39
526
1
原创 C++进阶|多态知识点详解及经典面试题总结
(2)然后进入B类的构造函数的函数体中调用test函数,由于B中无test函数只能去父类A中调用,在A类中的test函数体中调用func函数,这个时候因为派生类的初始化列表已经走完了,虚表指针也形成了,并且func被子类重写由this指针也就是A*父类指针调用func满足多态,所以在B类中的func中先让mval++变成1然后打印1。下⾯的代码我们可以看到,如果~A(),不加virtual,那么delete p2时只调⽤的A的析构函数,没有调⽤B的析构函数,就会导致内存泄漏问题,因为~B()中在释放资源。
2024-09-21 15:25:53
1239
原创 数据结构|二叉搜索树
•⼆叉搜索树中可以⽀持插⼊相等的值,也可以不⽀持插⼊相等的值,具体看使⽤场景定义,后续我们学习map/set/multimap/multiset系列容器底层就是⼆叉搜索树,其中map/set不⽀持插⼊相等。key的搜索场景实现的⼆叉树搜索树⽀持增删查,但是不⽀持修改,修改key破坏搜索树结构了。3. 如果⽀持插⼊相等的值,插⼊值跟当前结点相等的值可以往右⾛,也可以往左⾛,找到空位置,插⼊新结点。2. 树不空,按⼆叉搜索树性质,插⼊值⽐当前结点⼤往右⾛,插⼊值⽐当前结点⼩往左⾛,找到空位置,插⼊新结点。
2024-09-21 10:41:36
941
原创 初识C++|stack、queue、priority_queue的使用和模拟实现
仿函数是通过定义一个类并在其中重载()操作符来实现的。这个操作符可以接受任意数量和类型的参数(根据需求),并可以返回一个值。// 定义仿函数public:// 重载()操作符Add add;// 创建仿函数对象// 像函数一样调用仿函数对象return 0;
2024-09-10 09:32:27
883
原创 C++进阶|继承
🍬🧁1. 继承的概念及定义1.1 继承的概念是⾯向对象程序设计使代码可以的最重要的手段,它允许我们在,这样产生新的类,称。没有继承之前我们就需要设计了两个类Student和Teacher,Student和Teacher都有姓名/地址/ 电话/年龄等成员变量,都有identity⾝份认证的成员函数,设计到两个类⾥⾯就是冗余的。当然他们 也有⼀些不同的成员变量和函数,⽐如⽼师独有成员变量是职称,学生的独有成员变量是学号;学生的独有成员函数是学习,⽼师的独有成员函数是授课。
2024-09-10 09:31:55
1273
原创 初识C++|string类的使用及模拟实现
string原型最基本的string类由于编码方式不同,又衍生出不同的string类由此可见,string是一个模板string类——管理字符串的类,是用字符的顺序表实现的在使用string类时,必须包含以及;注意不是!
2024-08-08 17:47:02
406
原创 初识C++|模板初阶
通过实参a1将T推演为int,通过实参d1将T推演为double类型,但模板参数列表中只有。注:如果类型不匹配,编译器会尝试进行隐式类型转换,如果无法转换成功编译器将会报错。一个T,编译器无法确定此处到底该将T确定为int 或者 double类型而报错。该语句不能通过编译,因为在编译期间,当编译器看到该实例化时,需要推演其实参类型。所以当一个匹配既没有非模板函数,也没有函数模板可以匹配到的时候,会。,是编译器用使用方式产生特定具体类型函数的模具。1. 重载的函数仅仅是类型不同,,对于模板函数的使用,
2024-07-19 11:24:18
996
原创 初识C++|类与对象(下)
因为那些你不在初始化列表初始化的成员也会⾛初始化列表,如果这个成员在声明位置给了缺省值,初始化列表会⽤这个缺省值初始化。内部类本质也是⼀种封装,当A类跟B类紧密关联,A类实现出来主要就是给B类使⽤,那么可以考 虑把A类设计为B的内部类,如果放到private/protected位置,那么A类就是B类的专属内部类,其他地⽅都⽤不了。的,不具有交换性,⽐如A类是B类的友元,但是B类不是A类的友元。,如果A是B的友元, B是C的友元,但是A不是B的友元。,不属于某个具体的对象,不存在对象中,存放在。
2024-07-18 21:53:10
985
原创 C/C++内存管理
如果 malloc申请空间成功就直接返回,否则执行用户提供的空间不足应对措施,如果用户提供该措施 就继续申请,否则就抛异常。在申请空间后会调用构造函数完成对象的初始化,delete在释放空间前会调用析构函数完成空间中资源的清理释放。4. malloc的返回值为void*, 在使用时必须强转,new不需要,因为new后跟的是空间的类型。5. malloc申请空间失败时,返回的是NULL,因此使用时必须判空,new不需要,但是new需。类似,但它会分配一块连续的内存空间,并且将分配的内存初始化为零。
2024-07-18 20:19:32
735
1
原创 初识C++|类和对象(中)——类的默认成员函数
要求调⽤这个成员变量的默认构造函数初始化。如果这个成员变量,没有默认构造函数,那么就会报错。说明:C++把类型分成内置类型(基本类型)和⾃定义类型。内置类型就是语⾔提供的原⽣数据类型,如:int/char/double/指针等,⾃定义类型就是我们使⽤class/struct等关键字⾃⼰定义的类型。
2024-07-16 11:35:50
931
1
原创 初识C++|类与对象(上)
如果嵌套了结构体的情况,嵌套的结构体对⻬到⾃⼰的最⼤对⻬数的整数倍处,结构体的整体⼤⼩ 就是所有最⼤对⻬数(含嵌套结构体的对⻬数)的整数倍。的⽅式,⽤类将对象的属性与⽅法结合在⼀块,让对象更加完善,通过访问权限选择性的将其接口提供给外部的⽤⼾使⽤。类是对象进⾏⼀种抽象描述,是⼀个模型⼀样的东西,限定了类有哪些成员变量,这些成员变量只是声明,类定义了⼀个新的作⽤域,类的所有成员都在类的作⽤域中,在类体外定义成员时,需要使⽤。编译器编译后,类的成员函数默认都会在形参第⼀个位置,增加⼀个当前类类型的指针,叫做。
2024-07-16 11:32:18
704
1
原创 初识C++ | 基本介绍、命名空间、输入输出、缺省函数、函数重载、引用、内联函数、nullptr
1979年,当时的正在⻉尔实验室从事计算机科学和软件⼯程的研究⼯作。⾯对项⽬中复杂的软件开 发任务,特别是模拟和操作系统的开发⼯作,他感受到了现有语⾔(如C语⾔)在表达能⼒、可维护性 和可扩展性⽅⾯的不⾜。于是,牛逼的祖师爷决定自己创造语言!1983年,Bjarne Stroustrup在C语⾔的基础上添加了⾯向对象编程的特性,设计出了C++语⾔的雏形, 此时的C++已经有了类、封装、继承等核⼼概念,为后来的⾯向对象编程奠定了基础。这⼀年该语⾔被正式命名为C++。重点。
2024-07-11 17:00:43
802
原创 数据结构 | 超详细讲解七大排序(C语言实现,含动图,多方法!)
注意:两次交换的中间需要进行依次判断,判断maxi是否仍然等于begin,因为经过第一个交换后原begin位置的值已经交换到mini位置去了,如果判断成立,maxi也应该跟随原begin的值的移动移动到mini位置。2.划分两个大小为gap的子数组[begin1,end1],[begin2,end2],这两个数组应当是有序的,对其进行归并,归并完后,继续向后划分两个大小为gap的子数组,继续归并,直到整个数组被遍历完。3.将a[begin]和a[mini]进行交换,将a[end]和a[maxi]进行交换。
2024-06-06 17:39:25
1356
2
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人