自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

小侯宝的博客

长风破浪会有时

  • 博客(129)
  • 收藏
  • 关注

原创 【C++】命名空间 ( namespace )

命名空间是一种用来避免命名冲突的机制,它可以将一段代码的名称隔离开,使其与其他代码的名称不冲突;命名空间的原理是将一个全局的作用域分成一个个命名空间,每个命名空间是个单独的作用域,同时若是在同一个作用域内可能出现的命名冲突也不会造成影响,有效避免了命名空间的污染;从上面可知命名空间的作用,既然命名空间能够有效防止命名冲突,那该如何定义命名空间?在定义命名空间时,应该使用namespace修饰且在该修饰词后定义名字并在其后跟**{ }**在{ }内的元素即为该命名空间的成员;

2023-07-18 20:42:55 11644 14

原创 『 实战项目 』Cloud Backup System - 云备份

客户端第一次下载的时候会收到这个响应信息,第二次下载的时候将会把信息发送给服务器,想要让服务器根据这个唯一标识判断资源是否又被修改,如果未被修改则直接使用原先缓存的数据,无需重新下载;与上传文件相似,当服务器检测到一个文件由热点文件变为非热点文件状态后将要对文件进行压缩,压缩后将要与未压缩文件进行区分,将其单独放在一个列表中进行管理;检测一个文件的信息与备份的文件信息是否一致,检测文件是否又被修改,若是文件被修改则需要进行备份;在对一个文件进行压缩后,这个文件压缩后的文件名为原文件名+对应的压缩格式;

2025-01-20 16:37:50 1063

原创 『 Linux 』高级IO (四) - Epoll 的工作模式

当然根据不同程序的编码,实际上只能说ET模式的效率普遍高于LT模式的效率,因为实际上两者只是通知方式不同从而使得程序设计者在程序设计方式上不同,当然LT模式也可以编写为类似于ET的方式,即将文件描述符设置为非阻塞模式,并且在每次通知后都循环将本轮的所有数据取走,因此实际上在效率上还是依靠程序的设计;当然ET的IO效率更高的另一个原因为,当ET模式的通知降低频率后所倒逼程序员对每轮数据读取完毕,这意味着TCP将通告一个更大的窗口给对方,在概率上使得对端每次都发送更大窗口大小的数据,提高每次IO的吞吐量;

2025-01-08 17:39:22 1001

原创 『 Linux 』高级IO (三) - Epoll模型的封装与EpollEchoServer服务器

当内核就绪队列中已就绪事件大于用户所预设空间时,就绪队列本次只会传递用户预设空间响应数量的就绪事件,余下的就绪事件将继续存放至内核就绪队列当中;其中红黑树用来管理正在被监听的文件描述符,就绪队列用来管理已触发的文件描述符,回调机制用于检测并推送事件触发的结果到就绪队列中;当监听套接字文件描述符事件就绪后,对应的事件将被推送至用户预设空间中,之后才能将监听套接字文件描述符中的新连接进行获取并将新连接。时间到期,没有事件就绪(就绪队列中没有就绪事件,因此不会有就绪事件被推送至用户预设的事件空间中);

2025-01-04 23:45:42 1206

原创 『 Linux 』高级IO (二) - 多路转接

其提供了更大范围,甚至是没有上限的数组,因此其需要遍历的范围也将变得更大,就如上述代码而言,每次套接字描述符事件就绪后无非是监听到了新的连接或是某个描述符获取到了新的信息,无论是哪种,实际的处理方式都是对一个描述符进行处理;遍历辅助数组,找到未被占用的地方将新的连接添加到该处,若是辅助数组中所有位置都被占满则表示服务器满载,无法添加新的连接,需要关闭新的连接;最终所返回的结果中就绪的事件不仅仅只有监听套接字获取新连接的事件,同样的还有读写套接字中的可读事件是否就绪,因此需要在。

2025-01-04 00:12:39 683

原创 『 Linux 』高级IO (一)

而常常提到的非阻塞IO效率高的原因是在使用非阻塞IO模型时(可能是轮询也可能是信号驱动),在进行等待的过程中进程不会阻塞在原地一直等待至事件就绪,在非阻塞等待事件就绪的这个时间段进程可以去完成一些其他的任务,在总体的效率上提升效率;类型时,其中位图中的位标识对应文件描述符需要关心的对应事件是否就绪,而当该函数因某些文件描述符中的某些事件就绪后而返回,对应的事件类型中的位图将会被修改为事件已经就绪的文件描述符;上述中的模型中除了异步IO外,其他所有的IO模型执行流都将在事件就绪后去进行数据的拷贝操作;

2024-12-23 20:36:11 629

原创 『 Linux 』数据链路层 - ARP协议及数据链路层周边问题

由于发出ARP响应的一端在对ARP响应进行封装为MAC帧时对应的MAC地址填充为源发送方的MAC地址,故即使其他设备接收到了该MAC帧也会因为MAC地址不同而丢弃该MAC帧;在确认该ARP报文为响应后,将会检查包含在其中的IP地址和MAC地址,并将ARP响应中的IP地址和MAC地址作为映射关系写入本地的ARP缓存中,通常这个映射信息会有一个。在主机A收到的若干个ARP响应后ARP缓存将会以最先的ARP响应为准,对应的伪造的ARP响应的IP地址为路由器B的IP地址,而对应的MAC地址为主机C的MAC地址;

2024-11-30 23:13:01 687

原创 『 Linux 』数据链路层 - MAC帧/以太网帧

在上面的内容中可以了解到,每一个设备都要对所接收到的MAC帧进行检查,确保MAC帧中的MAC地址与本设备的MAC地址相同时才会交付给上层,而真正交付到对应设备时,对应的设备同样的在数据链路层中先进行解包为IP数据包,再由网络层协议如IP协议检查对应的路由表找到下一个设备的IP地址,再交付给数据链路层封装为MAC帧交由下一台设备;在数据传输过程中,通常一个数据若是过大,那么它在网络中需要传输的时间也就更长,因此MAC帧对报文进行了定长的方式,避免过大的报文在网络中进行传输;

2024-11-25 23:55:23 1431

原创 『 Linux 』网络层 - IP协议 (二)

通常情况路由器具备了一个非常重要的功能,即构建子网;同时路由器需要实现跨网络通信,说明路由器必须存在两个或以上的IP地址,通常在路由器中可以看到几个接口,分别是一个WAN口和几个LAN口;WAN口IP被称为公网IP,LAN口IP被称为私网IP;其中WAN口对应的IP地址是作为上一层子网,如运营商子网中的其中一个子网IP,而通常一个LAN口则代表一个子网,对于LAN口IP而言,该IP将作为该子网中的第一台设备IP;或者在一些情况下,多个LAN口可以共享同一个子网;

2024-11-25 17:03:22 1179 3

原创 『 Linux 』网络层 - IP协议(一)

通过设置子网掩码可以将一个较大的IP网络划分成若干个更小的网络(子网),这种划分不仅节省IP地址资源,还能提高网络的效率和安全性,对网络进行合理的划分可以减少广播域的大小从而提升网络传输效率;亿左右,而TCP/IP协议规定,每个主机都需要有一个IP地址,虽然采用了DICR缓解了IP地址过于浪费的问题,提高了IP地址的利用率,但实际上IP地址的绝对上限并没有增加;在同一个班级中每个人的号数是独立的,同样的在同一届的专业中,每个班级的班级号也是独立的,但是在不同的班级中可以有相同的班内学号;

2024-11-22 22:00:13 1170 3

原创 『 Linux 』文件与网络套接字的内部关系

假设使用浏览器在线观看视频,网速突然变慢或者是视频数据没有到达时,浏览器将希望从套接字收取更多的数据来显示视频,但由于数据尚未到达,浏览器操作数据的进程可能需要等待,对应的这个浏览器进程将会被添加到该套接字。对应的方法集则是特定于网络协议套接字操作的方法,对应结构体中包含了一系列的函数指针,这些函数指针定义了网络套接字在不同协议栈(如TCP,UDP等)下的行为,包括套接字的创建。方法集在文件指向网络时,主要的操作作用域是对上的,通常情况下在进行网络通信时,数据的生产位置是位于用户层/应用层的,而。

2024-11-18 21:05:40 931

原创 『 Linux 』网络传输层 - TCP(四)

但实际上上述的这些策略更多的是考虑网络通信时双端的通信策略,在实际通信过程中所有数据都是需要经过网络的,而网络并不是任何时候的状态都是好的,所以为了保证通信时的可靠性,TCP协议在进行网络通信时也需要对网络进行评估,根据不同的网络健康状态作一定的策略,即。而TCP的连接是和套接字描述符直接相关的,对应的该进程的套接字描述符的生命周期又是伴随进程的,间接来说TCP的连接是与进程的生命周期相关的;

2024-11-17 16:41:01 947

原创 『 Linux 』网络传输层 - TCP(三)

通常情况下,已经发出去但是还没有收到应答的报文,需要被TCP暂时保存起来,而实际上这些报文的保存位置通常为发送方的发送缓冲区中,通常情况下无论是由应用层缓冲区发送到TCP中还是TCP缓冲区发送到网络中所用的方式都是以拷贝的方式,即拷贝到对应的位置但仍在原来的位置保留原件,这样可以更加灵活的进行不同策略的实现,如是否进行数据的重发等等;滑动窗口的窗口滑动本质上是以双指针的形式向右动态调整当前窗口的大小,从而拓展滑动窗口大小,与算法中的滑动窗口原理相当,对应的缓冲区的区域划分也是通过这样的原理实现的;

2024-11-10 17:04:30 1289

原创 『 Linux 』网络传输层 - TCP(二)

为什么是三次握手三次握手是TCP为了保证双方通信时具有可靠性所定制的一种策略;而三次握手可以确保客户端和服务端至少都向对方发送了一次消息,从而确保连接建立的更为可靠;以朴素的角度来看三次握手实际上也可以被解析成四次握手;但为了提升连接创建的效率,TCP采用捎带应答的策略,在第二次握手中将ACK报文与SYN报文整合成了一个报文,即为SYN+ACK报文;在三次握手中能够确保双端都对对方进行一次消息的发送以及消息的接收来确保连接的稳定,因此三次握手中任何一次握手都不能少;

2024-11-01 18:23:17 1141 1

原创 『 Linux 』网络传输层 - TCP (一)

但对于发送端与接收方处理能力不匹配的情况,如果出现大量的丢包情况则可能降低双方的效率,尤其是对于发送方而言,接收方无法快速处理来自发送方所发来的TCP数据段从而导致接收缓冲区溢出,则每次新的从发送方发来的TCP数据段都将可能被丢弃,导致发送方为了保持数据传输的可靠性而不停重传,大大降低了发送端的效率;的问题,即A端向B端发送字节流,B端回复A端字节流使A端明白刚刚所发的字节流已经被接收,那么B端又如何证明该回复的字节流被A端所接收,A端是否需要对该回复字节流再次进行一次应答?

2024-10-27 12:22:10 734

原创 『 Linux 』网络传输层 - UDP

通常情况下,无论是发送方还是接收方,机器中必定会存在大量的UDP报文,发送方的机器中不同的UDP报文可能是不同进程发送的,而接收方的UDP报文可能是由不同的发送端向该端进行发送的,那么当机器中存在大量相同类型的数据时系统必然要对该类数据进行管理维护;接收缓冲区是任何端都必须必备的,因为不同的主机其对数据的处理能力是不同的,UDP协议需要接收缓冲区的主要原因是需要兼顾接收方对数据的处理能力,以防止接收方由于对数据的处理不及时而导致的大量数据丢包;

2024-10-25 16:17:27 821

原创 『 Linux 』HTTPS

HTTPS协议是一种在HTTP基础上增加了加密层(SSL或TLS)的协议,确保数据传输的保密性、完整性和可靠性。数据通常分为明文和密文,其中明文未经加密,易被窃听,而密文通过加密算法和密钥难以被破解。加密方式主要有对称加密和非对称加密,对称加密快但密钥管理复杂,非对称加密安全但速度慢。HTTPS结合两者优势,使用CA认证确保公钥的安全性,避免中间人攻击。CA认证通过数字证书验证通信双方身份,保障传输安全。

2024-10-22 20:48:14 811

原创 『 Linux 』HTTP(三)

而通信双方若是使用HTTP协议时双方都必须约定所使用的HTTP协议版本,通常情况下该版本的诉求方为客户端,因为通常为客户端向服务端发起请求,在请求中会存在所使用的HTTP版本,对应的在进行服务端开发时应做好不同HTTP版本的开发以应对不同版本客户端所发的请求;的文档文件,通常情况下大部分的浏览器都会直接将其以网页的形式进行解析,但图片文件不同,图片文件由于不存在类似的头部,浏览器无法明确知道该资源的类型,所以需要明确的指出资源的类型;它通过在服务器上存储用户数据,解决了 HTTP 协议的无状态特性;

2024-10-19 00:28:38 909

原创 『 Linux 』HTTP(二)

休息了一阵子 已收心包括请求的请求行,请求报头,请求数据等信息,通常情况下浏览器会对响应进行对应的解析,所以只需要根据约定向浏览器发回对应格式的响应即可,但是服务器不同,服务器需要将来自浏览器的请求进行一定程度的解析才能够根据请求中的不同字段与属性给予其客户端一定的访问权限;中对HTTP进行了一个较为简单的介绍,介绍包括域名,URL,URL中关于URL特殊符号的编码以及解码(URLEncode和URLDecode),简单介绍了一下HTTP报文的格式(包括请求于响应),并且编写了一个简易的HTTP服务器;

2024-10-15 00:18:50 1199

原创 『 Linux 』HTTP(一)

当服务端接收到来自浏览器的请求时需要对请求行和请求头部进行读取以及分析,而请求头部过后紧接着的是请求数据,也就是请求正文,而为了避免请求头部与请求数据中的混淆,请求头部和请求数据(请求正文)之间将存在一行为空行,这个空行只有行分隔符,当服务端读取至一行只存在行分隔符时则表示请求行和请求头部已经读取完毕,剩下的内容即为请求数据(请求正文),换种说法即为报头与有效载荷进行分离;短语也是状态信息,状态信息是根据状态码变化而变化的,是对状态码的文本描述,虽然状态短语不是严格必要的,但是能够帮助用户理解响应;

2024-09-18 20:17:27 1894

原创 『 Linux 』协议的定制

序列化与反序列化部分是属于协议定制的一部分,只需要修改头文件即可;这里为了方便后续的调试,使用条件编译来区别自定义序列化与反序列化和使用JSON进行的序列化与反序列化;// 编码函数,将文本编码成特定格式的字符串// 解码函数,从编码后的字符串提取出原始文本// "len"\n"num1 op num2"\n 或 "len"\n"result code"\n// 移除已提取的报文内容public:public:public:// 序列化请求对象,转为字符串。

2024-09-12 20:03:07 1394

原创 『 Linux 』简单TCP英译汉程序

意思是服务端每新创建一个相同的进程实际上在关闭了多余的文件描述符后每个子进程因处理客户端发来的请求的文件描述符是相同的,而多线程中由于同一个进程间的不同线程共享同一个文件描述符表,这表示在多线程版本中不存在多余的文件描述符,但同样的文件描述符是一个有限资源,当服务端中的文件描述符资源被使用完毕后,再次创建线程来进行网络通信时这次的网络通信将会失败;

2024-09-04 22:58:07 1975

原创 『 C++ 』多线程相关

但如果在最后的比较中,当前内存中的值与最初加载进寄存器中的值不同则表示这个值已经被其他线程修改过了,如果再把当前寄存器的值写回内存中则是一个无用功,会导致数据不一致问题,那么这次的CAS操作则是失败,此时需要重新将内存中的值加载进寄存器中并再次进行上述操作,当比较时当前内存中的值与原来加载进寄存器的值相同时才能把在寄存器中计算后的值写回内存中,才算一次CAS操作成功;但是这里的互斥锁有一个问题,由于临界资源很短,且对临界资源的操作是非常小的操作,使用互斥锁反而有种"杀鸡焉用牛刀"的感觉;

2024-09-02 00:56:16 1276

原创 『 Linux 』TCP套接字网络通信程序

TCP套接字提供了面向连接的 , 面向字节流的 , 传输可靠的传输方式;面向连接的TCP是一种面向连接的协议 , 在通信开始之前需要建立联系;这个连接通过三次握手过程建立以确保通信双方已经准备好进行数据传输;面向字节流TCP传输的数据被看作是连续的字节流而不是消息或数据包;这意味应用程序可以将数据作为字节流发送 , TCP将会负责这些字节流按照顺序传送给接收方 , 接收方也会以同样的顺序接收数据;面向字节流也意味着可以直接使用writeread来对该套接字描述符进行操作;

2024-08-28 01:47:49 1331

原创 『 C++ 』线程库

C++ 标准库自 C++11 引入了线程支持库,提供了一个完整的线程管理工具集。这些工具包括用于创建和管理线程的类如 std::thread,以及同步机制如互斥锁 (mutex) 和条件变量 (condition_variable) 。这些库在不同操作系统上由不同的底层实现支持,譬如在 Linux 上基于 pthread 线程库。在创建和销毁线程时,可以直观地使用线程的构造和析构函数,并通过简单的成员函数进行线程操作。条件变量和互斥锁确保了多线程环境下的数据一致性及避免竞态条件。

2024-08-25 15:31:10 892

原创 『 Linux 』利用UDP套接字实现简单群聊

套接字实现一个客户端和一个服务端,客户端向服务端发送数据,服务端进行数据的拼接并返回拼接后的数据,或者是传入一个回调函数,服务端通过调用回调函数调用。函数进行初始化,然后进入一个无限循环,不断从用户获取输入并发送到服务器,并接收服务器的响应;当服务端接收到客户端所发的信息时这个数据包中存放的除了数据以外还包含着客户端的基本信息,如。存放着用户的信息,检查该哈希表中是否存在该用户的信息,有则无行为,无则添加;用于初始化服务器的基本参数,包括套接字文件描述符,端口号,运行标识符;

2024-08-19 01:48:21 856 2

原创 『 C++ 』IO流

流是指数据的有序传输序列,路表示数据从一个地方流向另一个地方的过程,流可以是输入流也可以是输出流,具体取决于数据的流动方向;输入流数据从外部设备(文件,键盘等)流入程序中;输出流数据从程序流向外部设备(如显示器,文件等);IO流是指用于处理输入输出操作的流,C++中的IO流用于程序与外部环境(用户,文件系统,网络等)之间交换数据的机制;IO流通过标准库中的一组类和对象实现允许程序员以统一的方式处理不同类型的输入输出设备;

2024-08-17 12:08:37 1201

原创 『 Linux 』利用UDP套接字简单进行网络通信

数据在进行网络传输的时候需要转成标准的网络字节序,本质原因是在数据传输的过程中网络通信的两端的字节序要相同以确保数据发送至对端时出现数据的解析错误;在接收客户端的数据时同样需要一个相同地址族的结构体,与对应的长度信息,两个信息作为输出型参数用于接收客户端发送的套接字信息;这个函数用于在套接字上发起到指定地址的连接,用于将客户端的套接字连接到远程服务器的地址和端口,是客户端编程中的关键一步;这个函数调用成功使返回一个非负整数,这个非负整数是新创建的已连接套接字的文件描述符,新描述符与请求连接的客户端通信;

2024-08-15 16:42:50 1163

原创 『 C++ 』单例模式与IO流

单例模式(Singleton Pattern)是一种创建型设计模式,确保一个类在应用程序的生命周期内仅有一个实例,并提供一个全局访问点来访问该实例。单例模式主要目的是为了控制某些类的实例化以避免产生多个实例,从而节省资源和避免数据不一致问题。单例模式的核心要点包括唯一性、全局访问点和加载方式。常见的加载方式有饿汉加载和懒汉加载。饿汉加载在程序启动时即初始化实例,线程安全但可能浪费资源;懒汉加载在需要时才初始化,节约内存且初始速度较快,但需要注意线程安全问题。

2024-08-13 18:47:25 1024

原创 『 Linux 』网络基础(二)

本质上采用大端字节序作为网络字节序主要是为了标准化,确保在不同系统之间数据能够被正确的解码,若是未指定字节序标准,当大端字节序接受到小端字节序发送的数据时将会解码错误;是面向数据包的协议,将数据划分成一个个独立的数据包,每个数据报在网络上传输时是一个独立的实体且具有边界,通常为单个数据报提供较小的负载;小端字节序中数据的低位字节存储在内存的低地址处,数据的高位字节存储在内存的高地址处,即数据从右往左进行存储;协议规定,多字节数据在传输数据时必须采用大端字节序,这意味着数据的高位字节先传输,低位字节后传输;

2024-08-12 18:34:49 945

原创 『 C++ 』特殊类实现与类型转换

这篇文章详细介绍了不同场景下C++类的设计与类型转换方法。通过具体实例,作者讲解了如何设计不能被拷贝的类,确保资源的唯一性,并探讨了只能在堆上或栈上创建对象的类的实现方法。对于不能被继承的类,文章介绍了如何利用final关键字和私有化构造函数来实现。此外,文章还深入解析了C++中的四种主要类型转换运算符:static_cast、dynamic_cast、reinterpret_cast和const_cast,并通过代码示例说明了它们各自的用途和实现细节。最后,作者强调了在进行类型转换时需要注意的安全性问题,

2024-08-11 15:17:30 1074

原创 『 C++ 』智能指针 ( 万字梳理 )

现代智能指针提供了一个自定义的删除器使智能指针通过包含不同的对象来对其进行特殊的删除;以shared_ptr为例,存在一个包含特定的类内模板函数的构造函数,支持传入一个自定义删除器对特殊的资源完成特殊的资源清理工作;其传入的自定义删除器可以为任何可调用对象,lambda表达式,function包装器,bind绑定对象,仿函数等可调用对象;});// 使用定制删除器(lambda表达式)关闭文件});

2024-08-08 19:07:38 1583

原创 『 Linux 』网络基础 (一)

协议分层是计算机网络中组织和管理网络协议的重要方法。通过将网络通信过程划分为多个层次,每一层负责特定的功能,从而简化设计与实现。常见的协议分层模型包括OSI模型和TCP/IP模型。OSI模型将网络通信分为七层,分别是应用层、表示层、会话层、传输层、网络层、数据链路层和物理层。TCP/IP模型则通常简化为四层:应用层、传输层、网络层和链路层。协议分层的主要优点包括简化设计、模块化、标准化和故障隔离,使得各层可以独立开发与维护,提升了网络的灵活性与可扩展性。

2024-08-06 18:44:44 954

原创 『 C++ 』异常

异常处理是C++中用于管理错误和异常情况的重要机制。通过使用try-catch块,程序能够在运行时捕获和处理潜在的错误,使得代码更加清晰和易于维护。在C++中,异常可以是内置类型或自定义类型,允许开发者根据具体需求进行灵活处理。C++标准库提供了一套完善的异常体系,以std::exception为基类的多个异常类(如std::runtime_error和std::logic_error)用于描述不同类型的错误。当函数抛出异常时,控制流会自动转移到最近的catch块,避免了在每个函数中手动检查错误的繁琐。

2024-08-05 22:47:32 824

原创 『 Linux 』线程安全的单例模式,自旋锁与读写锁

这篇文章主要介绍了计算机编程中的一些重要概念和技术,包括单例模式(懒汉模式和饿汉模式)、自旋锁、读写锁。单例模式讲解了其特点和优点,以及两种加载方式。自旋锁阐述了其机制、初始化、锁定与解锁等。读写锁介绍了其状态、在 POSIX 线程库中的使用,包括初始化、加锁和解锁等。这些内容对理解多线程同步和资源管理有重要意义。

2024-08-04 16:39:49 854

原创 『 C++11 』模板可变参数包,Lambda表达式与 function 包装器

这篇文章深入探讨了C++11引入的几个关键特性:可变参数模板、Lambda表达式和std::function包装器。文章通过详细的解释和丰富的代码示例,阐述了这些特性的概念、语法和使用方法,展示了它们如何增强C++的泛型编程能力和函数式编程特性。同时,文章还介绍了std::bind的用法,进一步丰富了C++11的函数对象操作能力。整体而言,本文为理解和应用这些现代C++特性提供了全面而实用的指导。

2024-08-03 22:08:26 1474

原创 『 Linux 』线程池与 POSIX 线程的封装编码实现

这篇文章详细介绍了线程池的概念和实现。文章首先解释了线程池的基本原理,包括资源分配、复用和管理等方面。接着,展示了一个线程池的C++实现,包括线程池类的设计、任务队列的管理、线程同步机制等核心组件。文章还提供了一个简单的任务类和测试代码,用于演示线程池的使用。此外,文章还讨论了线程的封装技术,展示了如何将POSIX线程封装成一个C++类,使线程的使用更加面向对象和便捷。文章通过代码示例和详细注释,清晰地展示了线程池和线程封装的实现细节,包括构造函数、线程启动、任务处理等关键方法。

2024-08-02 21:03:51 1069

原创 『 Linux 』POSIX 信号量与基于环形队列的生产者消费者模型

本文介绍了基于环形队列的生产者消费者模型。首先阐述了信号量的概念、类型和操作方法,包括P操作和V操作。然后详细讲解了POSIX信号量的使用,包括初始化、销毁、等待和释放等操作。接着描述了环形队列在生产者消费者模型中的应用,解释了模型的核心要素和工作原理。最后通过具体的C++代码实现,展示了如何使用信号量和互斥锁来构建一个线程安全的环形队列,并通过简单数据和复杂任务两个例子演示了模型的实际应用。整体内容涵盖了理论基础和实践应用,为理解和实现并发编程中的同步机制提供了详细指导。

2024-08-02 16:00:45 822

原创 『 Linux 』基于阻塞队列的生产者消费者模型

生产者-消费者模型是一种常见的多线程设计模式,用于协调生产者和消费者线程之间对共享资源的访问。在这个模型中,生产者负责生成数据或任务并将其放入共享缓冲区,而消费者则从缓冲区中取出数据进行处理。关键点在于生产者和消费者通过共享缓冲区进行解耦,允许它们以不同的速率工作。该模型通过互斥锁和条件变量来实现线程同步。互斥锁确保对共享资源的互斥访问,而条件变量则用于线程间的通信和协调。当缓冲区满时,生产者等待;当缓冲区空时,消费者等待。这种设计提高了系统的并发性和效率,特别适合处理生产和消费速率不匹配的场景。

2024-08-01 16:37:20 1179

原创 『 Linux 』线程同步问题与条件变量

同步问题涉及多线程环境下,确保访问同一资源时的顺序性和数据安全。互斥锁常用于保护临界资源,防止数据竞争和不一致。条件变量是一种线程同步机制,允许线程在特定条件满足前等待,并在满足时被唤醒。它通常与互斥锁结合使用,确保共享资源的安全访问。生产者-消费者模型是一种多线程设计模式,生产者生成数据放入缓冲区,消费者从缓冲区读取数据处理。通过互斥锁和条件变量,生产者和消费者可以有效地同步和互斥访问共享资源,提高系统效率和稳定性。

2024-07-31 21:46:13 960

oracle9i经典测试用表

该表用于MySQL中的增删查改练习等;

2023-12-06

oracle9i经典测试用表

该测试用表为Oracle9i的一个经典测试用表,雇员表; 该表可以用来进行对数据库的增删查改的联系操作; 请在MySQL中使用"SOURCE /路径"的方式进行使用

2023-12-06

空空如也

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

TA关注的人

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