- 博客(80)
- 收藏
- 关注
原创 Gin框架学习
Gin 是 Go 语言生态中最流行的 HTTP Web 框架之一,以和著称。它基于 Go 标准库的net/http包开发,同时提供了更丰富的功能和更友好的 API,非常适合构建 RESTful API、Web 服务等。
2025-09-11 17:51:22
693
原创 深入解析Linux C/C++ Timer定时器的实现核心原理
使用的时候,只需要在你的主循环里,把epoll_wait的超时参数设置为TimerManager::getRecentTimeout(),每次epoll_wait()返回后,处理一下超时事件TimerManager::takeAllTimeout()。时间用的是相对系统启动的时间,是一个不可以设置的恒定的时间(nonsettable monotonic clock),而不是用的真实的时间(Wall time ,墙上时间),因为这个时间可能会随着设置系统的日期时间而发生跳跃性的改变。
2025-08-28 19:50:01
766
原创 Cmake使用简介
aux_source_directory()也存在弊端,它会把指定目录下的所有源文件都加进来,可能会加入一些我们不需要的文件,此时我们可以使用set命令去新建变量来存放需要的源文件,如下。使用简单方便,可以跨平台,构建项目编译环境。尤其比直接写Makefile简单(在构建大型工程编译时,需要写大量的文件依赖关系),可以通过简单的CMake生成负责的Makefile文件。cmake命令会执行目录下的CMakeLists.txt配置文件里面的配置项,一个基本的CMakeLists.txt的配置。
2025-08-18 16:29:53
564
原创 Timer
该 Timer 类实现了基本的定时任务调度功能,线程安全设计较为基础,但在线程管理、定时精度、功能灵活性等方面存在明显缺陷,适合简单场景使用。若用于生产环境,需针对上述问题进行优化。这个 C++ Timer 类实现了一个基于线程的定时器功能,支持周期性执行任务,并可设置执行次数(有限次或无限循环)。
2025-08-15 10:13:39
775
原创 高性能服务器框架设计(未写完)
常用的算法,比如round robin,即轮询机制,即,假设不考虑中途有连接断开的情况,一个新连接来了分配给B1,又来一个分配给B2,再来一个分配给B3,再来一个分配给B4。服务器端为了能流畅处理多个客户端链接,一般在某个线程A里面accept新的客户端连接并生成新连接的socket fd,然后将这些新连接的socketfd给另外开的数个工作线程B1、B2、B3、B4,这些工作线程处理这些新连接上的网络IO事件(即收发数据),同时,还处理系统中的另外一些事务。这在写跨两个平台代码时,需要注意的地方。
2025-08-12 03:02:33
648
原创 TCP三次握手
分包则是指一个大的数据包由于网络传输的限制(如 MTU,最大传输单元),被分割成多个小的数据包进行传输,到了接收方再进行重组,这就好比一个大的快递被拆分成多个小包裹分别发送,收件人需要将这些小包裹重新组装成完整的物品。以包头加上包体长度的方法为例,在发送数据时,先在数据包的头部添加一个固定长度的字段,用于表示包体的长度,接收方在接收到数据后,首先读取包头中的长度字段,然后根据这个长度来准确地读取包体的数据,这样就能确保每个数据包都能被正确地解析,避免了粘包和分包带来的混乱。
2025-08-02 04:30:23
353
原创 《Go Web编程实战派--从入门到精通》的随笔笔记
接下来我们通过Go语言来创建GET、POST、PUT、DELETE这4种类型的窖户端请求,来初步了解害户端的创建方法.通过上面的代码可以获得百度首页的HTML文档。访问浏览器的127.0.0.1:80。
2025-07-28 21:14:39
291
原创 GoLang学习笔记
Go 语言数据类型分为基本数据类型和复合数据类型。基本数据类型:整型、浮点型、布尔型、字符串。复合数据类型:数组、切片、结构体、函数、map、通道 (channel)、接口等。Go 语言中只有强制类型转换,没有隐式类型转换。Go 语言中常用的流程控制有 if 和 for,switch 和 goto 主要用于简化代码、降低重复代码,属于扩展类流程控制数组是一系列同一类型数据的集合,每个数据称为数组元素,包含的元素个数为数组长度。在 Golang 中,数组是长度固定的数据类型,长度是类型的一部分,例如。
2025-07-23 18:19:38
830
5
原创 python学习笔记
数据容器根据特点的不同,如: 是否支持重复元素 是否可以修改 是否有序,等 分为5类,分别是: 列表(list)、元组(tuple)、字符串(str)、集合(set)、字典(dict)3. 序列如何做切片 序列[起始:结束:步长] 起始可以省略,省略从头开始 结束可以省略,省略到尾结束 步长可以省略,省略步长为1(可以为负数,表示倒序执行)序列是指:内容连续、有序,可使用下标索引的一类数据容器 列表、元组、字符串,均可以可以视为序列。注意:列表可以一次存储多个数据,且可以为不同的数据类型,支持嵌套。
2025-07-20 17:13:09
252
原创 HTTP报文
用于 HTTP协议交互的信息被称为HTTP。请求端(客户端)的HTTP 报文叫做,响应端(服务器端)的叫做。HTTP报文本身是由多行(用 CR+LF作换行符)数据构成的字符串文本。HTTP 报文大致可分为和两块。两者由最初出现的空行(CR+LF)来划分。通常,并不一定要有报文主体。
2025-07-07 11:32:44
396
原创 图论:floyed算法
Floyd 算法是一种用于寻找加权图中所有顶点对之间最短路径的经典算法,它能够处理负权边,但不能处理负权环。该算法的时间复杂度为 \(O(V^3)\),其中 V 是图中顶点的数量。Floyd 算法的核心思想是动态规划。它通过逐步引入中间顶点来不断更新任意两点之间的最短路径。
2025-05-26 10:05:08
533
原创 大一获得16届蓝桥省一的个人总结
本人从大一前的暑假开始接触并学习计算机相关知识,暑假把c语言学完并刷了一些c语言的练习题,并学完c语言后开始学习数据结构,后又开始学习了c++开始用c++语言在各个刷题平台刷题。这是我到出分为止各个平台的刷题数据。
2025-05-09 19:49:53
774
1
原创 Qt学习笔记
上一节我们详细分析了connect()函数。使用connect()可以让我们连接系统提供的信号和槽。但是,Qt 的信号槽机制并不仅仅是使用系统提供的那部分,还会允许我们自己设计自己的信号和槽。这也是 Qt 框架的设计思路之一,用于我们设计解耦的程序。本节将讲解如何在自己的程序中自定义信号槽。信号槽不是 GUI 模块提供的,而是 Qt 核心特性之一。因此,我们可以在普通的控制台程序使用信号槽。经典的观察者模式在讲解举例的时候通常会举报纸和订阅者的例子。有一个报纸类Newspaper,有一个订阅者类。
2025-05-05 19:19:22
807
原创 Linux信号(游双未整理完)
Linux下,一个进程给其他进程发送信号的API是kill函数。其定义如下:#include#includesignal.h该函数把信号sig发送给目标进程;信号发送给组ID为-pid的进程组中的所有成员Linux定义的信号值都大于0,如果sig取值为0,则kill函数不发送任何信号。但将sig设置为0可以用来检测目标进程或进程组是否存在,因为检查工作总是在信号发送之前就执行。不过这种检测方式是不可靠的。一方面由于进程PID的回绕,可能导致被检测的PID。
2025-04-25 17:07:52
781
原创 高效并发编程:无锁编程
无锁编程,即不使用锁的情况下实现多线程之间的变量同步,也就是在没有线程被阻塞的情况下实现变量的同步,所以也叫非阻塞同步(Non-blocking Synchronization),实现非阻塞同步的方案称为“无锁编程算法”。为什么要非阻塞同步,使用lock实现线程同步有非常多缺点:产生竞争时,线程被阻塞等待,无法做到线程实时响应dead locklive lock优先级反转使用不当,造成性能下降假设在不使用 lock 的情况下,实现变量同步,那就会避免非常多问题。
2025-04-23 20:24:09
817
原创 POSIX多线程
线程,作为进程内的执行单元,可以理解为进程这个大舞台上的一个个小舞者,各自有着独立的舞步(执行路径),却又共享着舞台的资源(进程资源)。与进程相比,线程更加轻量级。进程是系统进行资源分配和调度的基本单位,拥有独立的地址空间、内存、文件描述符等资源 ,进程间的切换开销较大。而线程则是共享所属进程的资源,它们之间的切换开销相对较小,就像在同一个舞台上不同舞者之间的快速换位,无需重新搭建整个舞台。线程的这些特点,使得多线程编程在提升程序执行效率上有着独特的优势。
2025-04-23 00:48:18
774
原创 epoll
在深入了解 epoll 之前,我们先来理解一下 IO 多路复用的概念。在网络编程中,我们常常会遇到这样的场景:一个服务器需要处理多个客户端的连接和数据传输。如果采用传统的方式,为每个客户端连接创建一个单独的线程或进程来处理,那么当客户端数量增多时,系统资源会被大量消耗,性能也会急剧下降。IO 多路复用就像是一个 “万能助手”,它可以让一个线程来处理多个 I/O 流。打个比方,你开了一家餐厅,来了很多桌客人。如果每个客人都安排一个服务员专门服务,那成本可太高了。
2025-04-22 14:21:53
814
原创 网络编程:IO复用
I/O复用使得程序能同时监听多个文件描述符,这对提高程序的性能至关重要。通常,网络程序在下列情况下需要使用I/O复用技术:❑客户端程序要同时处理多个socket。比如本章将要讨论的非阻塞connect技术。❑客户端程序要同时处理用户输入和网络连接。比如本章将要讨论的聊天室程序。❑TCP服务器要同时处理监听socket和连接socket。这是I/O复用使用最多的场合。后续章节将展示很多这方面的例子。❑服务器要同时处理TCP请求和UDP请求。
2025-04-22 08:56:42
482
原创 c++智能指针
C++里面的四个智能指针: aute-ptr,shared_ptr,unique_ptr,weak_ptr 其中后三个是C++11支持,并且第一个已经被C++11弃用。unique_ptr独占对象的所有权,由于没有引用计数,因此性能较好。2.共享所有权指针的传播和释放,比如多线程使用同一个对象时析构问题。weak_ptr配合shared ptr,解决循环引用的问题。1.内存泄洞:内存手动释放,使用智能指针可以自动释放。shared_ptr共享对象的所有权,但性能略差。不能将原始指针直接赋值给一个智能指针。
2025-04-21 16:49:09
233
原创 Socket
socket基础API。socket的主要API都定义在头文件中,包括创建socket、命名socket、监听socket、接受连接、发起连接、读写数据、获取地址信息、检测带外标记,以及读取和设置socket选项网络信息API。Linux提供了一套网络信息API,以实现主机名和IP地址之间的转换,以及服务名称和端口号之间的转换。这些API都定义在netdb.h头文件中,我们将讨论其中几个主要的函数。
2025-04-20 17:05:58
552
原创 条件变量condition_variable
条件变量是一个对象,能够阻止调用线程,直到通知恢复。是 C++ 标准库中的一个同步原语,它与互斥锁(std::mutex)配合使用,用于线程间的等待和通知机制。
2025-04-12 20:08:59
357
原创 快速幂fast_pow
快速幂算法是一种高效计算幂运算的算法,其核心思想是利用指数的二进制分解,把幂运算的时间复杂度从 O(p) 降低到 O(logp)。
2025-04-09 16:19:04
529
原创 高并发线程池导致 OOM 场景深度解析与 C++ 示例
在高并发场景下,线程池设计不合理,特别是或,会导致:系统快速创建大量线程每个线程分配独立的栈内存(一般默认1MB)内存持续上涨,最终耗尽物理内存或虚拟内存触发 OOM 或系统直接崩溃特别在 C++ 中,std::thread 直接创建原生线程,若无控制极易导致内存耗尽。
2025-03-30 18:45:54
517
原创 线程池(Thread Pool)cpp
是一种预先创建并维护若干线程的并发编程模型,所有任务提交后由池内线程处理,避免频繁创建销毁线程带来的系统开销。:复用固定数量的线程处理大量短时任务:防止线程数无控制增长导致内存耗尽或CPU调度崩溃:合理调度和管理任务执行顺序。
2025-03-30 18:13:35
1404
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人