自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(122)
  • 收藏
  • 关注

原创 c++ 基于std::packaged_task 和 std::future 实现异步任务线程池

用户传入要执行的函数,以及需要处理的数据(函数的参数) ,又线程池管理和执行异步任务。对象,该对象将用于获取任务的结果。任务被包装在一个 lambda 函数中,并添加到任务队列。:模板函数,用于向线程池中添加任务。:停止线程池中的所有线程。通知一个等待的线程有新任务可用。,如果是,则直接返回。),然后等待所有线程完成(通过。,通知所有等待的线程(通过。

2024-12-05 09:31:15 344

原创 C++ packaged_task

包装的对象,它可以当作一个可调用对象来调用任务执行,但它又不能完全的当作一个函数来使用,他不能想普通函数一样传递给线程使用。是 C++11 标准库中引入的一个模板类,它用于将可调用对象(如函数、lambda 表达式、函数对象或绑定表达式)包装起来,并允许异步地获取其结果。在包装时,你需要指定返回类型和参数类型,这些类型应该与你的可调用对象相匹配。类提供了一种方便的方式来创建任务,这些任务可以被放入线程中执行,而任务的结果可以在需要时通过。:首先,你需要定义一个可调用对象,这个对象就是你想要异步执行的任务。

2024-12-04 21:22:18 307

原创 MySQL【11】事务

事务就是一组DML语句组成,这些语句在逻辑上存在相关性,这一组DML语句要么全部成功,要么全部失败,是一个整体。MySQL提供一种机制,保证我们达到这样的效果。事务还规定不同的客户端看到的数据是不相同的。事务就是要做的或所做的事情,主要用于处理操作量大,复杂度高的数据。

2024-11-27 14:28:35 1051 3

原创 简单的递归

解题思路:据提示信息,使用暴力循环是一定会超时的。我们可以使用快速幂算法解决这道题目(实现快速幂有两种方法,1.递归 2.循环,在这里我们就用递归的方法实现了。1.我们想要求3^16我们可以先求出3^8,如果该数是偶数,那么他就是下面数的平方,如果该数是奇数,那么他就是下面数的平方再乘底数,这个就是快速幂算法的核心思想。这种实现方式相比简单的循环计算x的n次幂要高效得多,特别是当n非常大时。因为每次递归调用,n的值都会减半,所以递归的深度是O(log n),而不是O(n)。

2024-10-22 10:59:12 802 1

原创 C++ push_back和emplace_back

push_back和都是用于在容器(如std::dequepush_backpush_backpush_back。

2024-10-21 14:56:15 351 1

原创 C++ decltype

可能不足以明确表达我们想要的类型,特别是当我们需要引用类型、保持值的类别(左值或右值)或者处理函数调用的返回类型时。,并且没有正确地指定返回类型,可能会导致类型不匹配的错误,特别是在涉及到类型转换、模板特化或重载解析的情况下。提供了强大的类型推导能力,但在某些情况下,特别是涉及到复杂类型推导和模板编程时,使用。提供了一种强大的机制来查询和操纵类型,这在设计泛型库时尤其重要。是一个函数调用表达式,其返回类型可能不是显而易见的,特别是当。:在模板编程中,经常需要基于类型进行复杂的计算和推导。

2024-10-21 14:40:54 399

原创 【MySQL 10】索引

当MySQL需要读取数据时,它首先会检查其内存中的缓存池,如果所需数据不在缓存池(Buffer Pool)中,MySQL会向操作系统发出请求,操作系统随后从磁盘中读取数据,OS向磁盘中读取数据到文件缓冲区中,直到16KB,然后MySQL从文件系统缓存中将其复制到其内部的缓存池中。磁盘是计算机中的一个机械设备,相比于计算机其他电子元件,磁盘效率是比较低的,在加上IO本身的特征,可以知道,如何提交效率,是 MySQL 的一个重要话题。0和1的表示:在机械磁盘中,0和1是通过磁盘表面磁性材料的磁场方向来表示的。

2024-10-10 16:12:44 1087 5

原创 【MySQL 09】表的内外连接

但是从上表可以看出,并不是每个学生都有成绩,但是我们也是要把没有成绩的学生也显示出来。由于员工名字在emp中,部门名称在dept中,因此我们需要对两表先做笛卡尔积,形成一张大的表,再从大的表中筛选出符合条件的。对stu表和exam表联合查询,把所有的成绩都显示出来,即使这个成绩没有学生与它对应,也要显示出来。我们理解了左外连接,那么右外连接也就能理解了,就是以右表为主,左边表没有符合条件的,那么就填NULL。可见内连接,只显示两表交集部分,因为只有1号和2号学生才有成绩,所以只显示1,2。

2024-10-05 13:49:12 1096 2

原创 【MySQL 08】复合查询

数学上,有两个集合A={a,b},B={1,2,3},则两个集合的笛卡尔积={{a,1}, {a,2}, {a,3}, {b,1}, {b,2}, {b,3}} 列出所有情况,一共是2*3=6条记录;

2024-10-04 17:16:17 1352 4

原创 【MySQL 07】内置函数

函数被用来生成一个介于 0 和 1 之间的随机浮点数。这个数是一个大于或等于 0 且小于 1 的数,其精度可以达到小数点后很多位。要求显示exam_result表中的信息,显示格式:“XXX的语文是XXX分,数学XXX分,英语XXX分”函数将转换后的小写首字母与剩余的姓名部分连接起来,形成新的字符串。如果条件为假(FALSE),则返回第二个值。函数是MySQL中用于将字符串转换为小写的标准函数。列中提取从第二个字符开始到末尾的所有字符。,则返回第一个参数的值;列中提取每个员工姓名的第一个字符。

2024-10-03 13:22:28 1077 2

原创 【MySQL 06】表的增删查改

这种语句非常有用,特别是当你需要将一个表中的数据复制到另一个表中,或者需要将多个表的数据合并到一个表中时。如果你不指定更新的字段,那么就是用之前的值,在这里并没有指定sn,那么sn就使用原来的值。建议:对未知表进行查询时,最好加一条 LIMIT 1,避免因为表中数据过大,查询全表数据导致数据库卡死。将表中所有数据全部读出来,但在数据庞大的场景下不会这么使用,如公司的数据库中。注意:没有 ORDER BY 子句的查询,返回的顺序是未定义的,永远不要依赖这个顺序。像这样,不进行分组,查的就是全公司的情况了。

2024-10-02 17:43:39 2193 2

原创 【MySQL 05】表的约束

换句话说,主键列的值必须是唯一的,不能重复,并且表中的每一行都必须有一个主键值(尽管这个值可以是NULL,但在实际使用中,通常不会将主键设置为允许NULL,因为这样会失去主键的唯一性意义)。默认值:某一种数据会经常性的出现某个具体的值,可以在一开始就指定好,在需要真实数据的时候,用户可以选择性的使用默,使用关键字default。我们可以简单理解成,主键更多的是标识唯一性的。给student插入数据,我们选择课程id为1,2的时候,是可以插入成功的,插入其它id号,就会发生外键约束,MySQL拦截此操作。

2024-09-25 15:14:14 897 5

原创 【MySQL 04】数据类型

而且出于效率考虑,这些值实际存储的是“数字”,因为这些选项的每个选项值依次对应如下数字:1,2,4,8,16,32,....最多64个。在不同的编码下,字符所占的字节数都是不固定的:UTF-8 编码的字符可能占用1到4个字节,而 GBK 编码的字符大多数情况下占用2个字节,但也可能占用更多或更少的字节。有一个调查表votes,需要调查人的喜好, 比如(登山,游泳,篮球,武术)中去选择(可以多选),(男,女)[单选]类型提供精确的小数表示,这意味着它可以存储的数值具有完全的可预测性和准确性,不会有。

2024-09-24 16:18:12 898 6

原创 【MySQL 03】表的操作

这样我们就创建好了一张表,我们可以进入hellosql目录下进行查看:所以在数据库内建立表,本质就是在Linux下创建对应的文件。不同的存储引擎,创建表的文件不一样。因为这样改是覆盖之前的,所以在修改的时候记得重新加上描述。实际就是先删除整张表,然后重新创建这个表,以达到清空数据的效果。存储引擎不同,表结构数量也不一样,未来会对索引和事务造成影响。这样的显示看着很不舒服,;after 后面表示放在指定字段的后面。

2024-09-22 22:22:59 595 2

原创 【MySQL 02】库的增删查改及备份还原

可以告诉我们当前有哪些用户连接到我们的MySQL,如果查出某个用户不是你正常登陆的,很有可能的数据库被人入侵了。如果备份一个数据库时,没有带上-B参数, 在恢复数据库时,需要先创建空数据库,然后使用数据库,再使用source来还原。选择合适的字符集可以确保数据库能够支持所需的字符范围,而选择合适的校验规则则决定了数据库中字符数据的排序和比较方式。将指定数据库备份到指定的路径下,该操作不仅备份数据,而且将该数据库下进行的所有的有效操作都进行了备份。如果备份的不是整个数据库,而是其中的一张表,怎么做?

2024-09-22 16:14:33 1377 1

原创 【MySQL 01】数据库基础

数据库管理系统(如MySQL)提供了一套高级接口(如SQL语言),mysqld就会根据SQL语言,在数据库文件中给用户做增删查改,最后将结果返回给mysqld,mysqld再将结果交给用户。(eg:比如我想在百万行的IP地址中,找出所有以127开头的IP地址,这种情况下,数据库只需要给出指定的命令就可以了,但是文件操作并没有这么方便)MySQL的默认端口号是3306,如果您使用的是默认端口号,也可以省略这个选项。一般指的是,在磁盘或者内存中存储的特定结构组织的数据--将来在磁盘上存储的一套数据库方案。

2024-09-21 23:30:20 1315 6

原创 Linux--IO模型_多路转接

1. 阻塞IO模型特点:在阻塞IO模型中,应用程序发起一个IO请求后会一直阻塞等待操作完成,直到数据准备好或者超时才返回结果。在等待IO完成期间,应用程序会处于阻塞状态,无法执行其他任务。典型应用:阻塞socket、Java BIO等。优点:实现难度低,开发应用较容易。缺点:不适用并发量大的应用,因为每个请求IO都会阻塞进程,需要为每个请求分配一个处理进程(线程),系统开销大。2. 非阻塞IO模型特点:应用程序发起一个IO请求后会立即返回,无需等待操作完成。

2024-08-30 17:51:10 1258 3

原创 Linux——IO模型_多路转接(epoll)

一旦网卡中有数据了,网卡同个中断交给OS,接着网络协议栈就拿到数据了,所以在输入和输出缓冲区里有没有数据,OS是很清楚的,OS在缓冲区中设置回调方法,该回调方法就是epoll_ctl构建的。底层一旦有数据就绪并且是用户关心的,此时OS就会调用回调方法构建就绪队列的结点,填充清楚,是哪一个fd的什么事件已经就绪了,并连入就绪队列。只能循环读取,知道读不到数据,循环读取肯定是会遇到阻塞问题的,epoll当然是不敢阻塞的,否则进程会被挂起,因此fd必须是非阻塞的。进行增加,删除,修改操作。

2024-08-30 17:50:29 1238 4

原创 Linux--NAT,代理服务,内网穿透

在公司内服务器部署了一个登录服务,端口22,此时我也在中转服务器上也部署了一个服务端口8888,只不过小李访问服务器的xxx:8888服务,服务器会直接寻找并启动公司内部的shh:22的登录服务。左侧在内网中唯一的,右侧则是在公网中唯一,那么左侧和右侧是互为键值的,服务器做应答的时候就可以反向查表,发送给内网中的主机。),因为服务器可以向对应的客户端发消息,此时又拿到了两个客户端的信息,那么服务器是否能作为中转站将两个客户端的IP和port,分别发给对方,那么两个客户端就都知道对方的IP和port了(

2024-08-24 22:52:07 1135 1

原创 Linux--数据链路层(mac&&arp)

若此时A向E发送了消息,F向C发送了消息,那么交换机不会把交给E的消息给i1一侧了,交给F的消息也不会被转发给i0一侧了,这样就避免了两台主机的数据碰撞了,因为他们两个的数据在不同的区域内,在发送数据的时候,(src会带上自己的mac地址,dst是目的机的mac地址,data:发送的数据)会将发送的通过数据网络协议栈变成数据帧,然后通过局域网发送到局域网中,局域网的主机都能收到,主机会通过mac地址判断是不是自己的消息,如果是自己的消息,就会接收处理消息,最终以同样的方式发送回去。

2024-08-24 13:29:31 1334 1

原创 Linux--网络层 IP协议

经过精心的设计,合理的划分,可以高效支未来的报文路径查找,大大提高查找目标主机的效率:将网络划分为多个子网后,每个子网内部的通信不需要经过路由器(在广播域内),这样可以减少路由器上需要维护的路由表项数量。找不到偏移量为0的(没有前面部分),找不到更多分片==0的(没有后面部分),中间部分:将收到的片报文进行排序,因为第一分片的偏移量+自己的长度(除去报头:1500-20)=下一个分片的偏移量,如果没有对应的偏移量,那么就证明丢失了,而且丢失了哪一片也能知道。IP标识网络中主机的唯一性,指的是公网IP;

2024-08-22 23:19:41 1227 10

原创 Linux--传输层协议TCP

如果说有人把建立连接设置成一次握手,那么如果有一台机器给服务器发送大量的SYN报文(一个客户端给服务器发送大量的SYN,我们称为SYN洪水),对于客户端来说几乎没什么成本,此时服务器就被挂满了大量的连接,而且这些连接不会被使用,一次连接占一点资源,多次下来,导致服务器的资源越来越少,这就会导致资源的浪费。如果发送了1000个报文只接受了1个报文,丢了999个报文,因为TCP有滑动窗口的机制,他知道服务器能接收多少报文,所以不可能是服务器的问题,一定是网络出现了很大的问题。那么接收方ACK的确认序号怎么填?

2024-08-19 17:05:44 1220 1

原创 Linux--传输层协议UDP

负责数据能够从发送端传输接收端.

2024-08-15 16:12:03 1333 2

原创 Linux--应用层协议HTTP协议(http服务器构建)

GET方法也可以向服务器发送数据。在HTTP的URL中,端口号通常是不显示的,因为HTTP有一个默认的端口号80。服务器给我一个请求,我给他应答:首先进行服务列表构建,一个方法对应一个服务,如果客户端的请求存在参数,他就会调用外部方法,将参数传给外部方法处理,放回结果。所谓的URL域名就是服务器地址,就是唯一的一台主机,端口号对应唯一的服务进程,文件路径标明该主机上的唯一的文件资源。总的来说,这段代码实现了一个简单的HTTP服务器,它监听指定端口,并能够处理简单的登录请求,返回一个固定的HTML响应。

2024-08-14 23:48:01 1260 2

原创 Linux--应用层自定义协议与序列化(例子:网络计算器)

tcp服务器(Tcpserver)处理请求,会做IO,那么就调用IO服务(Service),IO服务处理做序列化和反序列化,还要处理业务,这时就会调用业务处理服务(NetCal网络计算器)。整体而言,这段代码展示了如何在C++中使用JSON进行简单的序列化和反序列化操作,以及如何设计一个简单的文本基通信协议来传输结构化数据。通信协议的设计是基于文本的,使用特定的格式来传输数据,包括长度字段和实际的JSON字符串。类,它负责处理客户端的连接请求,并对接收到的数据进行处理后再发送回客户端。

2024-08-12 12:16:26 1131 6

原创 Linux--Socket 编程 TCP(Echo Server)

如果读取到0字节(表示客户端关闭了连接),或者发生读取错误,循环会终止,并且会关闭与客户端的socket连接。它首先创建一个socket,然后将其绑定到服务器的地址和端口上,并监听连接请求。然而,在这个例子中,socket是默认创建的,因此它是阻塞的,所以这些错误不太可能发生。函数尝试连接到服务器。(尽管在这个示例中没有显示直接设置它的代码,但在实际应用中可能需要某种方式来优雅地关闭服务器),则循环会终止。• connect 和 bind 的参数形式一致, 区别在于 bind 的参数是自己的地址, 而。

2024-07-29 14:46:57 802 3

原创 Linux--Socket 编程 UDP(简单的回显服务器和客户端代码)

但如果你的服务器上有很多的ip地址,一个ip1,一个ip2,(如内网ip,回环ip)而我们上层的端口号为:8888。如果你的服务器bind ip1和8888,未来你的服务器收到各种报文都是发给8888的。有ip1的也有ip2的,但服务器只会接收ip1的报文,但如果服务器bind的ip为0,就意味着不管发送的ip是谁,只要是发给端口号为:8888的,服务器都会接收!(在做本地测试的时候,你也可以使用公网ip向你的服务器发消息,能不能成功,就看你的云服务器是怎么设定的了)函数等待并接收来自服务器的响应。

2024-07-26 17:11:03 1227 3

原创 Linux--Socket编程预备

程, 但是这样做, 会让系统进程管理和网络强耦合(pid每次启动的时候都会发送变化,那么两者之间有联系,意味着网络部分也要发送变化), 实际设计的时候, 并没有选择这。虽然 socket api 的接口是 sockaddr, 但是我们真正在基于 IPv4 编程时, 使用的数据结。0 - 1023: 知名端口号, HTTP, FTP, SSH 等这些广为使用的应用层协议, 他们的。种 sockaddr 结构体的首地址,不需要知道具体是哪种类型的 sockaddr 结构体,就可。

2024-07-24 22:54:47 1110

原创 Linux--网络基础

TCP/IP 协议的本质是一种解决方案,为了解决上面的问题然而上面的问题性质不同,种类不同,导致协议的性质不同,种类不同,所以协议是要分层处理的。TCP/IP 协议能分层, 前提是因为问题们本身能分层。

2024-07-24 15:52:57 1302

原创 Linux--实现线程池(万字详解)

IT行业这么火, 涌入的人很多. 俗话说林子大了啥鸟都有. 大佬和菜鸡们两极分化的越来越严重. 为了让菜鸡们不太拖大佬的后腿, 于是大佬们针对一些经典的常见的场景, 给定了一些对应的解决方案, 这个就是 设计模式。

2024-07-19 18:14:23 1079 1

原创 Linux--信号量

由于环形队列的下标也是属于临界资源的,如果不维持关系内部的互斥关系,是一定会破坏环形队列结构的。当一个线程(或进程)获取了信号量(将其值从1减为0),它便获得了对某个共享资源的独占访问权,其他试图获取该信号量的线程将被阻塞,直到信号量被释放(其值从0加回1)。sem_post函数用于信号量的V操作,主要作用是给信号量的值加上一个“1”,并可能唤醒一个或多个在该信号量上等待的线程。该函数用于信号量的P操作,从信号量的值中减去1,如果信号量的值变为0,则当前线程将被阻塞,直到信号量的值被其他线程通过。

2024-07-18 15:16:24 1222

原创 C++11 线程库

在C++11之前,涉及到多线程问题,都是和平台相关的,比如windows和linux下各有自己的接口,这使得代码的可移植性比较差。C++11中最重要的特性就是对线程进行支持了,使得C++在并行编程时不需要依赖第三方库。而且在原子操作中还引入了原子类的概念。要使用标准库中的线程,必须包含< thread >头文件。函数名功能thread()构造一个线程对象,没有关联任何线程函数,即没有启动任何线程thread(fn,...)

2024-07-18 11:26:28 846

原创 C++11 包装器

function包装器 也叫作适配器。C++中的function本质是一个类模板,也是一个包装器。用来包装可调用对象function类重载operator(),本质上也是一个仿函数。

2024-07-17 10:45:06 541

原创 Linux--线程同步

当队列满时,往队列里存放元素的操作也会被阻塞,直到有元素被从队列中取出(以上的操作都是基于不同的线程来说的,线程在对阻塞队列进程操作时会被阻塞)线程同步同样是需要互斥锁来实现的,但不同的是:线程同步,程之间所具有的一种制约关系,一个线程的执行依赖另一个线程的消息或状态。同步的目的是确保线程之间。由于生产者和消费者之间的解耦和并行处理能力,生产者消费者模型可以很容易地扩展到处理更多的数据或更复杂的任务。1.这两个的顺序是没有关系,因为无论是消费过程,还是生产过程,都是要持有锁的,唤醒后是要重新申请锁的。

2024-07-17 10:35:15 857 3

原创 Linux--线程互斥(加锁)

(即它在编译时就已经分配了内存空间)

2024-07-15 23:10:21 1188 2

原创 C++11 新的类功能&&可变参数模板

0.上篇文章C++11 右值引用和移动语义-优快云博客1.新的类功能默认成员函数原来C++类中,有6个默认成员函数:1. 构造函数2. 析构函数3. 拷贝构造函数4. 拷贝赋值重载5. 取地址重载6. const 取地址重载最后重要的是前4个(属于深拷贝,后两个用处不大。默认成员函数就是我们不写编译器会生成一个默认的。C++11 新增了两个:移动构造函数和移动

2024-07-13 23:45:02 1077 1

原创 C++11 lambda表达式

捕捉列表描述了上下文中那些数据可以被lambda使用,以及使用的方式传值还是传引用。

2024-07-12 15:24:12 878

原创 Linux--线程ID&&封装管理原生线程

我们生成的可执行程序在没运行的时候,当然也是在磁盘中的。当运行的时候,我们的可执行程序要加载到内存中,程序要变成一个进程的时候,它的PCB和内核数据结构要被创建出来,通过页表映射到可执行程序的代码和数据。库中创建一个线程,会为线程申请一个内存块(每创建一个线程申请一个内存块),所有的块都是连续存储的,内存块就是一个大号的结构体,内存块中存在线程在用户及最基本的属性和线程栈,这个栈是线程独立的栈结构。所以线程的概念,只是在库中表现出来的,所以我们把Linux中的线程称之为:用户级线程。

2024-07-10 15:46:39 986

原创 Linux--线程的控制

线程的创建,终止,等待,分离新线程如何终止?1. 线程函数 return3. main thread call pthread_cancel, 新线程退出结果是-1。

2024-07-09 17:15:19 1140 3

原创 Linux--线程(概念篇)

我们都知道系统和磁盘文件进行IO的基本单位是内存块4KB--8个扇区。我们以4GB大小的物理内存为例,物理内存被分为一个一个的页框,一个页框的大小也就是4KB,那么我们也就清楚了,磁盘加载到物理内存,操作系统会从磁盘中读取该页面并将其加载到物理内存中的一个页框/页帧中。在父子进程进行共享内存的全局变量int只占四个字节,我对他写入时要发生写时拷贝,写时拷贝的本质就让操作系统重新申请内存,那么拷贝的时候是拷贝四个字节还是4kb呢?对于全局变量int的写入操作,通常不会触发写时拷贝。

2024-07-08 22:41:28 1448 2

空空如也

空空如也

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

TA关注的人

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