- 博客(65)
- 收藏
- 关注
原创 图论:floyed算法
Floyd 算法是一种用于寻找加权图中所有顶点对之间最短路径的经典算法,它能够处理负权边,但不能处理负权环。该算法的时间复杂度为 \(O(V^3)\),其中 V 是图中顶点的数量。Floyd 算法的核心思想是动态规划。它通过逐步引入中间顶点来不断更新任意两点之间的最短路径。
2025-05-26 10:05:08
470
原创 大一获得16届蓝桥省一的个人总结
本人从大一前的暑假开始接触并学习计算机相关知识,暑假把c语言学完并刷了一些c语言的练习题,并学完c语言后开始学习数据结构,后又开始学习了c++开始用c++语言在各个刷题平台刷题。这是我到出分为止各个平台的刷题数据。
2025-05-09 19:49:53
545
1
原创 Qt学习笔记
上一节我们详细分析了connect()函数。使用connect()可以让我们连接系统提供的信号和槽。但是,Qt 的信号槽机制并不仅仅是使用系统提供的那部分,还会允许我们自己设计自己的信号和槽。这也是 Qt 框架的设计思路之一,用于我们设计解耦的程序。本节将讲解如何在自己的程序中自定义信号槽。信号槽不是 GUI 模块提供的,而是 Qt 核心特性之一。因此,我们可以在普通的控制台程序使用信号槽。经典的观察者模式在讲解举例的时候通常会举报纸和订阅者的例子。有一个报纸类Newspaper,有一个订阅者类。
2025-05-05 19:19:22
759
原创 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
759
原创 高效并发编程:无锁编程
无锁编程,即不使用锁的情况下实现多线程之间的变量同步,也就是在没有线程被阻塞的情况下实现变量的同步,所以也叫非阻塞同步(Non-blocking Synchronization),实现非阻塞同步的方案称为“无锁编程算法”。为什么要非阻塞同步,使用lock实现线程同步有非常多缺点:产生竞争时,线程被阻塞等待,无法做到线程实时响应dead locklive lock优先级反转使用不当,造成性能下降假设在不使用 lock 的情况下,实现变量同步,那就会避免非常多问题。
2025-04-23 20:24:09
721
原创 POSIX多线程
线程,作为进程内的执行单元,可以理解为进程这个大舞台上的一个个小舞者,各自有着独立的舞步(执行路径),却又共享着舞台的资源(进程资源)。与进程相比,线程更加轻量级。进程是系统进行资源分配和调度的基本单位,拥有独立的地址空间、内存、文件描述符等资源 ,进程间的切换开销较大。而线程则是共享所属进程的资源,它们之间的切换开销相对较小,就像在同一个舞台上不同舞者之间的快速换位,无需重新搭建整个舞台。线程的这些特点,使得多线程编程在提升程序执行效率上有着独特的优势。
2025-04-23 00:48:18
741
原创 epoll
在深入了解 epoll 之前,我们先来理解一下 IO 多路复用的概念。在网络编程中,我们常常会遇到这样的场景:一个服务器需要处理多个客户端的连接和数据传输。如果采用传统的方式,为每个客户端连接创建一个单独的线程或进程来处理,那么当客户端数量增多时,系统资源会被大量消耗,性能也会急剧下降。IO 多路复用就像是一个 “万能助手”,它可以让一个线程来处理多个 I/O 流。打个比方,你开了一家餐厅,来了很多桌客人。如果每个客人都安排一个服务员专门服务,那成本可太高了。
2025-04-22 14:21:53
756
原创 网络编程:IO复用
I/O复用使得程序能同时监听多个文件描述符,这对提高程序的性能至关重要。通常,网络程序在下列情况下需要使用I/O复用技术:❑客户端程序要同时处理多个socket。比如本章将要讨论的非阻塞connect技术。❑客户端程序要同时处理用户输入和网络连接。比如本章将要讨论的聊天室程序。❑TCP服务器要同时处理监听socket和连接socket。这是I/O复用使用最多的场合。后续章节将展示很多这方面的例子。❑服务器要同时处理TCP请求和UDP请求。
2025-04-22 08:56:42
451
原创 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
206
原创 Socket
socket基础API。socket的主要API都定义在头文件中,包括创建socket、命名socket、监听socket、接受连接、发起连接、读写数据、获取地址信息、检测带外标记,以及读取和设置socket选项网络信息API。Linux提供了一套网络信息API,以实现主机名和IP地址之间的转换,以及服务名称和端口号之间的转换。这些API都定义在netdb.h头文件中,我们将讨论其中几个主要的函数。
2025-04-20 17:05:58
536
原创 条件变量condition_variable
条件变量是一个对象,能够阻止调用线程,直到通知恢复。是 C++ 标准库中的一个同步原语,它与互斥锁(std::mutex)配合使用,用于线程间的等待和通知机制。
2025-04-12 20:08:59
293
原创 快速幂fast_pow
快速幂算法是一种高效计算幂运算的算法,其核心思想是利用指数的二进制分解,把幂运算的时间复杂度从 O(p) 降低到 O(logp)。
2025-04-09 16:19:04
468
原创 高并发线程池导致 OOM 场景深度解析与 C++ 示例
在高并发场景下,线程池设计不合理,特别是或,会导致:系统快速创建大量线程每个线程分配独立的栈内存(一般默认1MB)内存持续上涨,最终耗尽物理内存或虚拟内存触发 OOM 或系统直接崩溃特别在 C++ 中,std::thread 直接创建原生线程,若无控制极易导致内存耗尽。
2025-03-30 18:45:54
440
原创 线程池(Thread Pool)cpp
是一种预先创建并维护若干线程的并发编程模型,所有任务提交后由池内线程处理,避免频繁创建销毁线程带来的系统开销。:复用固定数量的线程处理大量短时任务:防止线程数无控制增长导致内存耗尽或CPU调度崩溃:合理调度和管理任务执行顺序。
2025-03-30 18:13:35
1212
原创 Socket函数用法详解
Linux 中的一切都是文件,每个文件都有一个整数类型的文件描述符;socket 也是一个文件,也有文件描述符。使用 socket() 函数创建套接字以后,返回值就是一个 int 类型的文件描述符。在 Linux 下使用 <sys/socket.h> 头文件中 socket() 函数来创建套接字,原型为:intsocketintdomaininttypeintprotocol功能:为通信创建一个端点,并返回该端点对应的文件描述符,文件描述符的使用原则是最小未分配原则。
2025-03-27 15:02:17
1251
原创 socket演示程序1
在 Linux 中,socket 也是一种文件,有文件描述符,可以使用 write() / read() 函数进行 I/O 操作,这一点已在《client 运行后,通过 connect() 函数向 server 发起请求,处于监听状态的 server 被激活,执行 accept() 函数,接受客户端的请求,然后执行 write() 函数向 client 传回数据。socket() 函数确定了套接字的各种属性,bind() 函数让套接字与特定的IP地址和端口对应起来,这样客户端才能连接到该套接字。
2025-03-27 00:01:13
549
原创 C++ 多线程编程:锁的六种写法
在多线程编程中,锁是一种重要的同步机制,用于避免多个线程在并发访问共享资源时发生竞态条件。C++ 提供了多种锁机制,它们各自适用于不同的场景。本文将介绍 C++ 中常用的锁,包括std::mutex和,并通过示例说明每种锁的原理、使用方式及其适用场景。
2025-02-21 20:59:44
711
原创 abstract.cpp
抽象类中:在成员函数内可以调用纯虚函数,在构造函数/析构函数内部不能使用纯虚函数。如果一个类从抽象类派生而来,它必须实现了基类中的所有纯虚函数,才能成为非抽象类。
2025-01-26 21:17:51
103
原创 Trie(算法版)
每当我们遇到一个新的字符且当前节点没有对应的子节点时(即son[p][u]为0),我们就需要创建一个新的节点,并更新son[p][u]为新节点的编号。同时,idx自增,用于分配新节点的编号。通过这种方式,Trie树可以动态地构建,插入和查询操作都能高效完成。假设情境1096:我们有一个Trie树,开始时是空的。我们现在要插入以下两个单词:cat和car。
2025-01-18 23:58:30
544
原创 Mysql学习笔记
找到MySQL安装目录下的bin目录,然后打开命令窗口,在命令窗口中按如下语法输入命令:mysqlhMySQL数据库服务器的IP地址u用户名p然后按下回车键,输入密码即可。
2025-01-18 00:01:12
664
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人