自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(115)
  • 资源 (1)
  • 收藏
  • 关注

原创 从源码解析Linux内核中的kfifo:C++实现单读单写无锁队列

kfifo是Linux内核的一个FIFO数据结构,采用环形循环队列的数据结构来实现,提供一个无边界的字节流服务,并且使用并行无锁编程技术,即单生产者单消费者场景下两个线程可以并发操作,不需要任何加锁行为就可以保证kfifo线程安全。

2024-05-15 17:38:10 287

原创 解析C++ 网络输入输出缓冲区Buffer类的设计与实现(muduo库)

网络输入输出缓冲区(Buffer)是为了优化网络通信性能而设计的。通过将数据存储在缓冲区中,可以减少对网络的频繁访问,提高数据传输效率。缓冲区还可以帮助处理数据流中的突发性和短时延,使得数据的发送和接收更加稳定和可靠。

2024-05-15 17:37:35 1002

原创 C++ 实现无锁队列——单读单写、多读多写

之前学习了 C++ 中原子变量的内存顺序,现在我们来看看原子变量和内存顺序的应用 – 无锁队列。本文介绍单写单读和多写多读的无锁队列的简单实现,从中可以看到无锁数据结构设计的一些基本思路。

2024-05-06 10:36:11 697

原创 C++深入解析锁机制与 CAS 实现

CAS,是Compare and Swap的简称,在这个机制中有三个核心的参数: 主内存中存放的共享变量的值:V(一般情况下这个V是内存的地址值,通过这个地址可以获得内存中的值) 工作内存中共享变量的副本值,也叫预期值:A 需要将共享变量更新到的最新值:B

2024-05-06 10:35:05 1107

原创 揭示C++设计模式中的实现结构及应用——行为型设计模式

行为型模式(Behavioral Pattern)是对在不同的对象之间划分责任和算法的抽象化。行为型模式不仅仅关注类和对象的结构,而且重点关注它们之间的相互作用。通过行为型模式,可以更加清晰地划分类与对象的职责,并研究系统在运行时实例对象 之间的交互。在系统运行时,对象并不是孤立的,它们可以通过相互通信与协作完成某些复杂功能,一个对象在运行时也将影响到其他对象的运行。

2024-04-27 21:56:06 777

原创 揭示C++设计模式中的实现结构及应用——结构型设计模式

结构型模式(Structural Pattern)描述如何将类或者对象结合在一起形成更大的结构,就像搭积木,可以通过 简单积木的组合形成复杂的、功能更为强大的结构。

2024-04-27 21:55:24 767

原创 揭示C++设计模式中的实现结构及应用——创建型设计模式

创建型模式(Creational Pattern)对类的实例化过程进行了抽象,能够将软件模块中对象的创建和对象的使用分离。为了使软件的结构更加清晰,外界对于这些对象只需要知道它们共同的接口,而不清楚其具体的实现细节,使整个系统的设计更加符合单一职责原则。创建型模式在创建什么(What),由谁创建(Who),何时创建(When)等方面都为软件设计者提供了尽可能大的灵活性。创建型模式隐藏了类的实例的创建细节,通过隐藏对象如何被创建和组合在一起达到使整个系统独立的目的。

2024-04-25 17:54:52 823

原创 探究C++20协程(6)——实现协程之间消息传递

之前主要关注的是协程与外部调用者的交互,这次也关注一下对等的协程之间的通信。

2024-04-25 17:48:37 1426

原创 探究C++20协程(5)——基于挂起实现无阻塞的定时器

当用传统的线程 sleep 函数来让程序等待时,实际上是在阻塞当前线程。阻塞意味着这个线程在指定的时间(例如100毫秒)内无法执行任何其他任务。这种方式虽然简单,但效率低下,因为它导致CPU资源在等待期间未被充分利用。协程提供了一种更加高效的方式来处理这种等待情况。它们在单个线程内部执行,并且能够在不阻塞线程的情况下挂起和恢复。当一个协程遇到需要等待的操作(如 sleep)时,它会挂起自身,而不会阻塞所在的线程。这使得线程可以转而去执行其他的协程。这种挂起和恢复的过程是由协程调度器管理的。

2024-04-22 19:56:40 814

原创 探究C++20协程(4)——协程中的调度器

协程本身并不能实现异步操作,它们需要依赖于调度器(Scheduler)的组件来实现异步操作。调度器负责管理协程的执行和调度。

2024-04-22 19:56:17 1010

原创 探究C++20协程(3)——通用异步任务Task的简单设计

其中,Result 的模板参数 T 对应于 Task 的返回值类型。有了这个结果类型就可以很方便地在需要读取结果的时候调用 get_or_throw。Promise type 是一个协程的基础结构,它定义了协程的返回类型、如何初始化和结束协程,以及协程在遇到 co_await、co_yield、和 co_return 时的行为。初始化和最终挂起:在协程开始执行前,会创建一个 promise 对象。当协程结束或最终挂起时,通过 promise 对象来清理和收尾。

2024-04-18 18:51:48 1495

原创 详解C++11原子变量、内存顺序及相关引用案例

C++11 将多线程纳入了标准。一旦涉及到多线程,就需要考虑并发,数据竞争 (date race),线程同步等问题。为此 C++ 提供了互斥锁 std::mutex,原子变量 std::atomic 等标准库。对于原子变量的操作,有一个很重要的概念就是内存顺序 (memory order),其中涉及到的概念很多,理解起来可能会有些困难。本文来从底层详解这个问题。其中 3.4 节和 3.5 节标注了星号,它们的实际应用较少,不感兴趣的可以先跳过,或者读完全文后再阅读。

2024-04-18 18:50:10 1242

原创 探究C++20协程(2)——取值、传值、销毁与序列生成器实现

序列生成器是一个非常经典的协程应用场景,尤其是在需要惰性生成数据或处理潜在无限的数据流时。序列生成器概念:序列生成器允许程序按需生成序列中的下一个元素,而不是一次性计算整个序列。这种方式可以节省内存,并允许处理无限或未知长度的数据序列。

2024-04-12 20:18:58 1257

原创 探究C++20协程(1)——C++协程概览

协程就是一段可以挂起(suspend)和恢复(resume)的程序,一般而言,就是一个支持挂起和恢复的函数。一般情况下,函数一旦开始,就无法暂停。如果一个函数能够暂停,那它就可以被认为是我们开头提到的协程。所以挂起(suspend)就可以理解成暂停,恢复(resume)就理解成从暂停的地方继续执行。Result 是按照协程的规则定义的类型,之后再详细介绍。在 C++ 20当中,一个函数的返回值类型如果是符合协程的规则的类型,那么这个函数就是一个协程。

2024-04-12 20:18:05 1213

原创 数字图像处理项目——基于BCNN和迁移学习的鸟类图像细粒度分类(论文/代码)

本文采用了ResNet50、VGG19、InceptionV3和Xception等四种不同的深度神经网络模型,并应用于鸟类图像的细粒度分类问题中,以探究其在该任务上的性能表现。其中,本文使用了BCNN(Bilinear CNN)方法,将两个CNN网络进行双线性池化,从而提取不同层级的特征信息,并结合SVM分类器进行分类。实验结果表明,四种不同的深度神经网络模型均能够对鸟类图像进行良好的分类。

2024-04-08 18:54:03 925 1

原创 数字图像处理项目——模糊图像边缘检测算法设计及实现(论文/代码)

本研究旨在针对大脑核磁图像中的黑色腔体进行有效分割,以提供可靠的腔体定位和分析。为此,采用了三种常用的图像分割方法:8邻域区域生长法、Canny算子边缘检测和8邻域边界跟踪法。首先,应用8邻域区域生长法来识别具有相似性质的像素,并将其合并为腔体区域。该方法基于种子点的选择和与相邻像素的相似性判断,能够快速而准确地生成初步的腔体分割结果。其次,运用Canny算子边缘检测方法,通过计算图像梯度和非极大值抑制,实现对腔体边缘的精细检测。该算法能够提取出清晰的边缘信息,对于复杂的腔体结构有较好的适应性。

2024-04-08 18:43:37 1158 1

原创 详解多态、虚继承、多重继承内存布局及虚表(C++)

详解C++多态、虚继承、多重继承内存布局,及虚函数表,虚表指针。

2024-04-07 18:25:33 1436 1

原创 C++20 semaphore(信号量) 详解

/ 用初始计数为1初始化一个信号量std::counting_semaphore是一种允许指定数量的线程同时访问资源的信号量。在这个例子中,一次只有一个线程可以访问由sem保护的资源。

2024-04-05 16:48:35 1914

原创 C++11新特性之关键字

auto:让编译器在编译器就推导出变量的类型,可以通过=右边的类型推导出变量的类型。decltype:相对于auto用于推导变量类型,而decltype则用于推导表达式类型,这里只用于编译器分析表达式的类型,表达式实际不会进行运算。

2024-03-28 10:24:35 318

原创 C++11新特性之并发

c++11引入了std::thread来创建线程,支持对线程join或者detach。我们创建了一个线程t,然后调用join函数等待线程执行完毕。接着我们创建了另一个线程t2,然后调用detach函数来分离该线程。当线程被分离后,它会在后台继续执行,与主线程独立运行,主线程也可以继续执行其他工作。

2024-03-27 16:36:08 1716

原创 2024东南大学553复试真题及笔记

leetcode原题。

2024-03-03 21:38:23 986

原创 左右值引用,move语义,完美转发

讲解了左右值引用,move语义,移动构造函数,完美转发,返回优化

2023-01-08 18:50:14 1444 2

原创 C++中模板与泛型编程

函数模板语法:template<typename T>函数声明或定义template ,声明创建模板typename, 表面其后面的符号是—种数据类型,可以用class代替T ,通用的数据类型,名称可以替换,通常为大写字母template<typename T>void myswap(T& a, T& b) { T temp = a; a = b; b = temp;}函数模板注意事项:自动类型推导,必须推导出一致的数据类型T,才可

2021-04-12 17:11:48 270

原创 C++中虚析构函数和虚基类

虚函数

2021-04-04 22:17:24 480

原创 在排序数组中查找元素第一个和最后一个的位置

二分查找第一个出现的位置int binary_first(vector<int>& nums, int target){ int l = 0, r = nums.size()-1; while (l < r) { int mid = l + (r - l) / 2; if (target < nums[mid]) r = mid - 1; else if (target > nums[mid]) l = mid + 1; else

2021-03-31 18:10:17 228

原创 C++中继承,派生与多态

继承概念面向对象程序设计中最重要的一个概念是继承。继承允许我们依据另一个类来定义一个类,这使得创建和维护一个应用程序变得更容易。这样做,也达到了重用代码功能和提高执行效率的效果。当创建一个类时,不需要重新编写新的数据成员和成员函数,只需指定新建的类继承了一个已有的类的成员即可。这个已有的类称为基类,新建的类称为派生类。可以多继承(一个派生类有多个基类)和多层派生(多层继承)。特点 : 新类可以继承原有类的属性和行为,并且可以添加新的属性和行为,或更新原有类的成员。格式为 class 继承类名:继

2021-03-24 20:43:30 860

原创 操作系统——输入/输出(I/O)管理

一、I/O设备概述

2021-03-22 21:07:06 789

原创 操作系统——文件管理

一、文件系统基础文件的概念文件的定义在操作系统中,通常将程序和数据组织成文件。文件可以是数字,字母或二进制代码,基本访问单元可以是字节,行或记录。文件可以长期存储与硬盘或其他二级存储器中,允许可控制的进程间共享访问。文件的属性通常包括以下属性:文件名 : 由创建文件的用户决定文件名,主要是为了方便用户找到文件,同一目录下不允许有重名文件。标识符 : 标识文件系统内文件的唯一标签,因此标识符只是操作系统用于区分各个文件的一种内部名称。类型 : 指明文件的类型。位置 :指向设备和设备上文件

2021-03-19 22:54:28 921

原创 leetcode——第 230 场周赛

题目地址统计匹配检索规则的物品数量水题,模拟即可。 class Solution { private: bool check(vector<string>& s, string ruleKey, string ruleValue) { if (ruleKey == "type") { return s[0] == ruleValue; } else if (ruleKey == "color") { return s[1]

2021-02-28 18:50:23 189

原创 leetcode——石子游戏系列题目

石子游戏亚历克斯和李用几堆石子在做游戏。偶数堆石子排成一行,每堆都有正整数颗石子 piles[i] 。游戏以谁手中的石子最多来决出胜负。石子的总数是奇数,所以没有平局。亚历克斯和李轮流进行,亚历克斯先开始。 每回合,玩家从行的开始或结束处取走整堆石头。 这种情况一直持续到没有更多的石子堆为止,此时手中石子最多的玩家获胜。假设亚历克斯和李都发挥出最佳水平,当亚历克斯赢得比赛时返回 true ,当李赢得比赛时返回 false 。定义二维数组 dp[i][j],其行数和列数都等于石子的堆数,dp[i

2021-02-25 12:12:14 2453

原创 操作系统——内存管理

一、内存管理基本原理内存管理功能负责内存空间的分配与回收提供某种技术从逻辑上对内存空间进行扩充提供地址转换功能,负责程序的逻辑地址与物理地址的转换提供内存保护功能。保证各进程在各自存储空间内运行,互不干扰程序的装入和链接程序的链接有以下三种方式:静态连接 :在程序运行之前,先将各目标模块及它们所需的库函数连接成一个完整的可执行文件(装入模块),之后不再拆开。装入时动态链接 : 将各目标模块装入内存时,边装入边链接的链接方式。运行时动态链接 :在程序执行中需要该目标模块时

2021-02-22 19:22:12 1188

原创 leetcode——229场周赛

229场周赛地址交替合并字符串给你两个字符串 word1 和 word2 。请你从 word1 开始,通过交替添加字母来合并字符串。如果一个字符串比另一个字符串长,就将多出来的字母追加到合并后字符串的末尾。 class Solution { public: string mergeAlternately(string word1, string word2) { string res = ""; int size1 = word1.size(); int size2 = w

2021-02-22 11:41:03 223

原创 C++中运算符重载

运算符重载:对已有的运算符重新进行定义,赋予其另一种功能,以适应不同的数据类型。重载后运算符的优先级和结合性不变运算符操作数的个数不能改变不能重载C++中不支持的运算符(@、#、$等)保持运算符的语义基本格式:返回值 [类名] operator 运算符 (形参表){}加号重载作用:实现两个自定义数据类型相加的运算class myint{public: int n; myint() {}; myint(int _n) { n = _n; }; myint operator+

2021-02-19 16:16:26 305 1

原创 操作系统——进程管理

一、进程与线程概念与特征程序段、数据段、PCB三部分组成了进程实体(进程映像)。一般情况下,我们把进程实体就简称为进程。注意: PCB是进程存在的唯一标志!例如,所谓创建进程,实质上是创建进程实体中的PCB。而撤销进程,实质上是撤销进程实体中的PCB。进程是进程实体的运行过程,是系统进行资源分配和调度的一个独立单位。状态与转换还有另外两种状态:创建态,进程正在被创建。需要申请一个空白PCB,填写一些信息。然后系统为该进程分配资源。结束态,进程正在系统中消失,进一步处理资源释放和回收工

2021-02-14 19:19:01 509

原创 操作系统——银行家算法

背景简介核心思想在银行中,客户申请贷款的数量是有限的,每个客户在第一次申请贷款时要声明完成该项目所需的最大资金量,在满足所有贷款要求时,客户应及时归还。银行家在客户申请的贷款数量不超过自己拥有的最大值时,都应尽量满足客户的需要。在这样的描述中,银行家就好比操作系统,资金就是资源,客户就相当于要申请资源的进程。系统在进行资源分配之前,应先计算此次分配资源的安全性,若分配不会导致系统进入不安全状态,则分配,否则等待。安全序列所谓安全序列,就是指如果系统按照这种序列分配资源,则每个进程都能顺利完成。只要

2021-02-14 18:52:51 918

原创 操作系统——进程同步中的经典问题

生产者-消费者问题问题重述及方法思考:能否改变相邻P,V操作的顺序呢?多生产者-多消费者问题如果去掉互斥量mutex,其实也是成立的。原本在于,该例题中的缓冲区大小为1,在任何时刻apple、orange、plate 三个同步信号量最多只能一个是1。最多只有一个进程的P操作不会被阻塞,并进去临界区。如果缓冲区大于1的话,则必须蛇者mutex信号量。吸烟者问题读者-写者问题读者优先互斥关系:写进程一写进程、写进程―读进程。读进程与读进程不存在互斥问题。写者进程和任何进程都互

2021-02-13 19:02:58 341

原创 贪心算法中的区间调度问题

一、问题概述经典问题,给出形如 [ begin,end ]的闭区间,设计一个算法,求出这些区间中最多有几个互不相交的区间。比如说,这四个区间,[1,2], [2,3], [3,4], [1,3],最多有三个互不相交,区间边界相交并不算重叠。那么这个问题是可以用贪心来解决的,这个问题看起来可以用几个贪心策略解决,但都是有问题的。比如说我们可以按照开始时间排序,但是可能存在某些区间开始很早,但是很长,使得我们错误地错过了一些短的区间。如果选择间隔最小的区间,则可能出现该区间相交的区间很多导

2021-01-21 20:18:55 421

原创 操作系统——计算机系统概述

一、计算机系统基本概念操作系统概念操作系统(Operating System,OS) 是指控制和管理整个计算机系统的硬件和软件资源,并合理地组织调度计算机的工作和资源的分配,以提供给用户和其他软件方便的接口和环境,它是计算机系统中最基本的系统软件。操作系统特征并发并发 : 指两个或多个事件在同一时间间隔内发生。这些事件宏观上是同时发生的,但微观上是交替发生的同一时间间隔(并发)和同一时刻(并行)的区别:在多道程序环境下,宏观上有多道程序在同时执行,而每个时刻,单处理机环境下只有一道程序在执行。

2021-01-19 20:05:05 593

原创 计算机网络——第四章、网络层

一、网络层功能主要任务是把分组从源端传到目的端,为分组交换网上的不同主机提供通信服务。网络层传输单位是数据报。功能如下:路由选择与分组转发的最佳路径异构网络互联拥塞控制异构网络互联所谓网络互联,是指将两个以上的计算机网络通过一定的办法,用一种或几种通讯处理设备相互连接起来。构成更大的网络系统。中间设备又称中间系统或中继系统。物理层中继系统:中继器,集线器。数据链路层中继系统:网桥或交换机网络层中继系统:路由器网络层以上的中继系统:网关使用物理层或者数据链路层中继系统时,只是扩

2021-01-17 22:24:54 955

原创 leetcode146——LRU缓存机制

题目地址LRU(Least Recently Used)是一种常见的页面置换算法,在计算中,所有的文件操作都要放在内存中进行,然而计算机内存大小是固定的,所以我们不可能把所有的文件都加载到内存,因此我们需要制定一种策略对加入到内存中的文件进项选择。一、hash+双向链表我们使用一个哈希表来维护,值和链表节点关系。用一个双向链表来模拟LRU缓存,该双向链表需要以下几个功能:删除尾部节点(代表最久未使用的数据)插入一个节点到头部位置(新使用了一个数据值)移动一个节点到首部(使用过的数据再次使

2021-01-12 22:26:14 157

简单的论坛系统.zip

使用PHP完成的论坛系统

2020-03-05

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除