- 博客(75)
- 收藏
- 关注
原创 【Linux网络】基于网络计算器理解应⽤层⾃定义协议与序列化(上)
我们把协议定制在Protocol.hpp文件内。我们要实现的是一个计算器,对于client端,计算数和计算操作符要有,对于server端,计算完成后的结果要有。但是只有结果不满足需求,还要区分返回的是结果还是异常。对于请求和响应来说可以提供无参构造,有参构造,还要有序列化和反序列化的接口。我们还需要一个协议的类,里面包含请求和响应的方法。
2026-01-05 15:16:10
1117
15
原创 【数据结构】常见排序
堆排【数据结构】堆的概念、结构、模拟实现以及应用稳定性是指,相同的值,排序后与排序前的相对位置是否容易发生改变。注意选择排序是不稳定的。快排的空间复杂度是。本次分享就到这里,我们下篇见~O%28N%29O%28N%29O%28N%29O%28N%29O%28N+
2025-12-27 10:00:00
708
9
原创 【C++】weak_ptr和shared_ptr循环引用问题
shared_ptr⼤多数情况下管理资源⾮常合适,⽀持RAII,也⽀持拷⻉。但是在循环引⽤的场景下会导致资源没得到释放而内存泄漏,所以我们要认识循环引⽤的场景和资源没释放的原因,并且学会使⽤weak_ptr解决这种问题。
2025-11-20 22:37:55
1107
12
原创 【Linux网络】Socket编程TCP-实现Echo Server(下)
上篇:【Linux网络】Socket编程TCP-实现Echo Server(上)
2025-11-10 20:27:27
881
20
原创 【Linux网络】Socket编程TCP-实现Echo Server(上)
本篇将基于Socket编程TCP实现一个Echo Server。这个EchoServer的功能和中实现的是一样的。1.预备工作首先我们要创建如下几个文件。一般来说,为了不让服务器能被拷贝,我们可以设计成单例模式,或者把服务器的赋值以及拷贝构造设为私有或禁用,单例模式之前实现过这里就不选择单例模式了,我们把复制和拷贝构造私有的话那如果UDP也想自己不被拷贝呢?这里介绍另一种方式,首先在Common.hpp里实现一个NoCope的类。然后让服务器的类继承NoCope类。
2025-11-08 22:19:14
1286
19
原创 【Linux网络】实现一个简单的聊天室
本篇将介绍如何设计一个简单的聊天室,Socket编程UDP协议。,⼀个sockfd,既可以读取,⼜可以写⼊,对于客户端和服务端同样如此。获取到信息的server,把这个信息当作一个任务推送给线程池,然后由线程池把消息转发给所有的client。在上图的右半部分,其中的server就可以看作一个生产者,整个转发消息的服务器就是一个生产者消费者模型。
2025-10-31 22:33:59
870
17
原创 【Linux网络】Socket编程UDP
本篇主要是写一个基于UDPUser Datagram Protocol ⽤户数据报协议)的简单的回显服务器和客户端代码,Echo server。
2025-10-23 20:39:07
1359
19
原创 【Linux】线程池
这把锁也要是static的,因为之前的锁_mutex是类内的成员属性,static的函数不能访问内类成员,还有一个原因是在我们创建单例的逻辑里,此时还不存在对象呢,那么此时对象里的锁_mutex也就不存在。
2025-10-18 12:00:00
1387
19
原创 【Linux】手搓日志(附源码)
计算机中的⽇志是记录系统和软件运⾏中发⽣事件的⽂件,主要作⽤是监控运⾏状态、记录异常信息,帮助快速定位问题并⽀持程序员进⾏问题修复。它是系统维护、故障排查和安全管理的重要⼯具。日志一般有下面几个必备要素我们实现的日志具备如下功能:首先要设计刷新策略,是往显示器打印?还是往指定文件里打印?这里要用策略模式,就要用到多态,多态相关知识在:【C++】多态详细讲解 。上面是实现往显示器打印的策略,还要实现一个往指定文件里打印的策略。往指定文件里打印就要考虑这个路径是否存在,不存在就要新建,这里用C
2025-10-11 12:00:00
1119
22
原创 【Linux】POSIX信号量、环形队列、基于环形队列实现生产者消费者模型
信号量(sem)也叫信号灯,类型是,就是一个,用来表明临界资源的,比如说看电影的时候,电影票就是资源,我们只要买了票这个资源就是自己的,所以信号量的本质就是。的信号量叫,二元信号量的本质就是互斥。所有线程申请信号量,就都要看到信号量,所以信号量也是临界资源。信号量就是一个计数器,申请信号量就是对这个计数器--(操作),释放资源就是对计数器++(操作),。0表⽰线程间共享,⾮零表⽰进程间共享;:信号量初始值等待信号量:P操作,会将信号量的值发布信号量:V操作,
2025-10-05 22:41:04
874
8
原创 【Linux】线程同步和生产者消费者模型
在线程互斥文章中我们演示的抢票的代码,运行结果虽然不会出现票数减到负数的问题了,但是仔细观察会发现,。相当于当前释放锁的进程,一释放又立马进到循环重新申请锁,导致别的线程申请不到锁,一直在等待,这就是其他线程。如果我们在while循环里加一个休眠,申请到锁的线程就会均匀一些。所以线程是和的,为了解决这样的问题,我们需要知道线程的同步。
2025-10-05 15:04:23
1089
10
原创 【Linux】线程的互斥
因为线程是共享地址空间的,就会共享大部分资源,这种共享资源就是公共资源,当多执行流访问公共资源的时候,就会出现各种情况的数据不一致问题。为了解决这种问题,我们就需要学习线程的同步与互斥,本篇将介绍线程的互斥。
2025-10-04 13:15:06
1254
23
原创 【Linux】多线程创建及封装
因为name是for循环里的一个临时数组,创建线程的时候传递过去的name是这个数组的起始地址,每一次for循环,编译器都会在同一个栈帧的固定偏移量位置上开辟name的空间,就导致每次for循环不停的开辟、释放、开辟、释放...但是每次开辟到的都是同一个位置,所以给pthread_create传过去的name起始地址就是。所以就发生了ThreadFunc里的name还没来得及改动,创建线程的for循环就进入下一个循环了,里面的name的内容就被修改了,意思就是。尝试设置其他线程的名称可能会导致错。
2025-10-03 12:33:38
1281
15
原创 【Linux】线程控制
因为显示器的本质就是文件,两个线程都能往同一个显示器文件打印内容,此时的显示器文件就是一种共享资源,而线程在访问的时候共享资源没有锁的保护就会发生混着打印的样子。当我们创建好新线程后,新线程就会去执行threadfunc,主线程继续往后执行,此时新线程就是一组虚拟地址表示的代码和数据,主线程就是另外一组虚拟地址表示的代码和数据,各自执行各自的一部分。因为新线程的入口函数要求返回值和参数类型都是void*的,pthread_join函数的第二个参数要是一个二级指针,才能获得新线程的退出信息。
2025-09-27 22:09:42
1077
17
原创 【Linux】system V共享内存
共享内存区是最快的IPC形式。⼀旦这样的内存映射到共享它的进程的地址空间,这些进程间数据传递不再涉及到内核,换句话说是进程不再通过执⾏进⼊内核的系统调⽤来传递彼此的数据。
2025-09-14 23:45:02
863
12
原创 【Linux】命名管道
之前说过的匿名管道只能实现有“血缘关系”进程之间的通信,如果想要实现进程和进程之间的通信就要用。进程和进程之间的通信也是需要让不同的进程看到同一份资源,使⽤来做这项⼯作。1.命名管道的创建和删除。
2025-09-09 22:53:45
1141
17
原创 【Linux】匿名管道和进程池
因为进程具有独立性,进程间通信需要操作系统先建立信道,先,然后才能通信。管道也是文件,属于文件,因为这个管道可以直接用pipe创建,没有名字,所以叫匿名管道。匿名管道只能用来进行有“血缘关系”的进程的进程间通信,如父进程和子进程之间,或者两个子进程之间。
2025-09-08 19:59:45
939
15
原创 【Linux】模拟实现Shell(下)
上篇实现的shell能处理一些基本命令和cd、echo这样的内建命令,以及让shell实现好了两张表,环境变量表和命令行参数表。这篇我们会在此基础上对shell的操作进行模拟实现。
2025-09-01 18:02:03
1028
13
原创 【Linux】模拟实现Shell(上)
在我们自己的命令行中首先会显示用户名、主机名、当前所在的路径。得到这些变量的方法很简单,通过环境变量获得,获取环境变量的函数就是。都获取到之后把这些内容打印出来,为了和原来的Shell命令行做一个区分,这里最后一个字符$用#代替。
2025-08-31 17:56:11
849
15
原创 【Linux】调试器gdb/cgdb的使用
Linux下我们编译好的代码是无法直接进行调试的,gcc/g++的默认工作模式是release模式,,本篇将介绍一下它的使用。
2025-08-06 16:19:35
933
13
原创 【Linux】基本指令
Ubuntu:快速按两下,具有 命令补全 和 档案补⻬ 的功能linux中的是 / ,win是 \。路径的最后一个文件(如上图的lesson2),可能是普通文件,也可能是一个目录,我们不确定,但我们能确定最后一个文件。
2025-07-19 17:08:28
883
16
原创 【C++】unordered_set和unordered_map的实现
由于Key不能取模的问题,我们设计了一个仿函数来解决。但是这是在底层实现的,也就是哈希表这层,不好控制,所以我们要把对Hash这个仿函数的控制转移到上一层,也就是unordered_set和unordered_map这层。做法就是把这里的缺省给去掉,然后加在Unordered_Set和Unordered_Map类模板上。这里增加了一个模板参数后,其他相应的地方也要改。unordered_set和unordered_map的实现就到这里,我们下篇见~
2025-07-09 18:37:07
817
17
原创 【C++】哈希表的实现(链地址法)
中我们介绍了一个哈希函数:除法散列法(除留余数法),还有一个处理哈希冲突的方法:开放定址法中的线性探测。本篇继续讲解一些别的哈希函数和处理哈希函数的方法,以及如何用实现这个哈希表。
2025-06-23 22:44:13
1065
11
原创 【C++】哈希表的实现(开放定址法)
哈希(hash)⼜称散列,是⼀种组织数据的⽅式。从译名来看,有散乱排列的意思。本质就是通过哈希函数把关键字Key跟存储位置建⽴⼀个映射关系,查找时通过这个哈希函数计算出Key存储的位置,进⾏快速查找。哈希表是通过哈希这种方式设计出来的一种存储数据的结构。
2025-06-20 22:13:58
1415
10
原创 【C++】unordered_map和unordered_set的使用
unordered_set的声明如下。Key就是unordered_set底层关键字的类型。unordered_set默认要求Key⽀持转换为整形,如果不⽀持或者想按⾃⼰的需求⾛可以⾃⾏实现⽀持将Key转成整形的仿函数传给第⼆个模板参数。unordered_set默认要求Key⽀持⽐较相等,如果不⽀持或者想按⾃⼰的需求⾛可以⾃⾏实现⽀持将Key⽐较相等的仿函数传给第三个模板参数unordered_set底层存储数据的内存是从空间配置器申请的,如果需要可以⾃⼰实现内存池,传给第四个参数。
2025-06-16 21:19:36
1166
10
原创 【C++】红黑树的实现详解
本篇来详细说一下红黑树。红⿊树是⼀棵⼆叉搜索树,AVL树是通过平衡因子控制树的平衡,红黑树就是通过颜色控制平衡,听起来比较抽象,但是这比AVL树学起来简单一点点。
2025-06-09 21:39:13
1108
11
原创 【C++】map和multimap的常用接口详解
insert的返回值也是pair,这里就出现两个pair,一个是前面说过的,pair存的是key/value,insert的返回值的pair存的是一个迭代器和bool值,因为insert可能插入成功,也可能失败。此时 it 就是西瓜的迭代器,it的first是string,就是这个“西瓜”,就是key,it的second是int,就是value。返回值是it的second,it就是苹果的迭代器,苹果的first是string,就是这个“苹果”,就是key,苹果的second是int,就是value。
2025-05-19 16:51:34
1632
16
原创 【C++】set和multiset的常用接口详解
2. set系列的使⽤前⾯我们已经接触过STL中的部分容器如:string、vector、list、deque、array、forward_list等,本篇文章将介绍一下map和multiset的使用。在介绍map之前我们先简单介绍一下什么是序列式容器和关联式容器。前⾯我们已经接触过STL中的部分容器如:string、vector、list、deque、array、forward_list等,这些容器统称为序列式容器,因为逻辑结构为线性序列的数据结构,两个位置存储的。
2025-05-15 17:43:44
1244
16
原创 【C++】多态详细讲解
多态是⼀个继承关系下的类对象,去调⽤同⼀函数,产⽣了不同的⾏为。⽐如Student继承了Adult。Adult对象买票全价,Student对象优惠买票。实现多态还有两个必须重要条件:必须是基类的指针或者引⽤调⽤虚函数被调⽤的函数必须是虚函数,并且完成了虚函数重写/覆盖。说明:要实现多态效果,第⼀必须是基类的指针或引⽤,因为只有基类的指针或引⽤才能既指向基类对象⼜指向派⽣类对象;第⼆派⽣类必须对基类的虚函数完成重写/覆盖,重写或者覆盖了,基类和派。
2025-02-05 22:21:36
1459
14
原创 【C++】详细讲解继承(下)
本篇来继续说说继承。上篇可移步至1.继承与友元友元关系不能继承,也就是说基类友元不能访问派⽣类私有和保护成员。像上面的代码,Fun函数只能访问Same基类的成员变量_name,_stuid是访问不到的。解决方法就是在派生类Student里面也加上友元声明,就可以了。
2025-01-24 22:34:11
1150
10
原创 【C++】详细讲解继承(上)
继承机制是⾯向对象程序设计使代码可以复⽤的最重要的⼿段。我们前面接触到的都是函数层次的复用,遇到过的类层次的复用有模板,而继承是类层次的一种新的复用。继承允许我们在保持原有类特性的基础上进⾏扩展,增加⽅法(成员函数)和属性(成员变量),这样产⽣新的类,称派⽣类(或子类)。假如现在我们模拟校园环境,设计老师(Teacher)和学生(Student)两个类。老师和学生都有姓名、电话、地址、年龄等成员变量,都有身份认证相关成员函数。
2025-01-23 18:32:33
1890
8
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅