自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 JDK11中zgc垃圾回收器的探索

垃圾回收器主要做的事情。

2024-07-10 22:33:32 626

原创 分布式锁实现方式

约束条件:互斥性;安全性;可用性;对称性;

2024-07-06 14:08:26 411

原创 msgpack 序列化与反序列化

1.msgpack 安装git clone git://github.com/msgpack/msgpack-c.gitcmake .sudo make installmsgpack 是一种高效的二进制序列化格式,它的功能类似 json ,可以在多种语言之间交换数据。但是它的速度更快,体积也更小,支持几乎所有的主流程序语言。2.程序实例序列以及反序列化数据#include <msgpack.hpp>#include <string>#include <ios

2022-03-24 14:48:57 1052

原创 asio 网络编程

1.asio 定时器的基本使用asio 定时器可以提供同步或异步定时事件,我们通常用定时器来处理客户端连接超时的问题,比如在服务器上设置一个超时时间,客户端连接成功之后,若在规定的超时时间内没有发送消息给服务器,则认为客户端连接已经断开了,可以关闭这个连接。同步以及异步定时器的实现#include <iostream>#include <boost/asio.hpp>int g_count = 0;void reset_timer(boost::asio:

2022-03-17 14:27:34 2040

原创 排序算法堆排序

参考:堆排序1. 堆的数据结构大顶堆;堆顶的数据大于子节点的数据;采用数组存储堆父子节点的下标关系:int child_index;int fa_index;fa_index=(child_index-1)/2;child_index=fa_index*2+1//leftchild_index=fa_index*2+2//right2.维护大顶堆找到孩子中较大数字;进行交换;维护代码void heapify(vector<int>arr,int n,in

2022-03-13 16:21:15 2036

原创 C++11 智能指针学习

1. shared_ptr 学习1.1 shared_ptr 定义方法先定义空指针,再定义指向内容;std::shared_ptr<int> p1 = std::make_shared<int>(); *p1 = 78;用在类中:std::shared_ptr<class> p1 = std::make_shared<class>(); *p1 = new class();定义指针时新构建类shared_ptr<class>p

2022-03-07 15:21:13 490

原创 C++11 lamba表达式学习

1.lamba表达式定义[captures] <tparams>(optional,c++20) (parameters) specifiers exception attr -> return_type requires(optional,c++20) {body}captures:捕获变量,捕获变量的方式有两种:按引用捕获和按复制捕获。parameters: lambda 表达式接受的参数,就像函数参数一样。return_type:函数返回值类型。body:语句块;里面写函

2022-03-07 13:44:32 456

原创 使用 epoll 和 boost 库线程池实现并发服务器

1. epoll编程相关1.2 epoll编程流程:epoll编程流程int epoll_create(int size) 创建用于处理accept的专用文件描述符 int epfd=epoll_create(10000);声明事件数组以及事件 //声明epoll_event结构体的变量,ev用于注册事件,数组用于回传要处理的事件 struct epoll_event ev,events[10000];监听(int epoll_ctl(int epfd, int op,

2022-03-02 14:56:35 739

原创 记录登录状态的功能的实现

1.Redis相关介绍;C++连接redis工具:hiredis安装cd /home/shiyanlouwget https://github.com/redis/hiredis/archive/v0.14.0.tar.gztar -xzf v0.14.0.tar.gzcd hiredis-0.14.0/makesudo make install##复制路径sudo cp /usr/local/lib/libhiredis.so.0.14 /usr/lib/测试程序:#inclu

2022-02-28 21:26:10 1064

原创 聊天室群聊以及私聊功能的实现

之前的代码框架:part11 私聊功能的实现1.1 客户端相关代码;为客户端添加私聊功能,用户可以选择一名目标用户名,然后开始和目标进行私聊,指定目标后先发送目标名到服务器进行绑定,而后每条消息都发送到服务器,服务器再转发到目标用户。客户端有两个线程,一个线程用于发送信息给对方,另外一个线程接收信息。为服务器添加处理私聊业务的代码,服务器接收客户端发来的绑定信息和私聊,绑定目标用户并将每条私聊信息都转发到目标用户的客户端处。当用户输入 exit 时,能够离开私聊,返回到主界面。 要面向对象编程

2022-02-27 18:05:55 2837

原创 聊天室用户功能实现

1.mysql 简介Linux下启动mysqlsudo service mysql start//启动mysqlmysql -U root //启动mysql;C++连接mysql的环境配置;sudo apt updatesudo apt install -y libmysqlclient-dev安装之后查看是否有mysql.hls /usr/include/mysql|grep mysql.hmysql下所进行的前期准备工作:进入mysql;sudo servi

2022-02-27 15:51:28 303

原创 多线程服务器

1.thread库的简单介绍thread库介绍:头文件:#include<thread>基本API://创建一个新线程来执行 run 函数:thread t(run); //实例化一个线程对象t,让该线程执行run函数,构造对象后线程就开始执行了//假如说 run 函数需要传入参数 a 和 b,我们可以这样构造:thread t(run,a,b); //实例化一个线程对象t,让该线程执行run函数,传入a和b作为run的参数//需要注意的是,传入的函数必须是全局函

2022-02-25 21:15:02 1109

原创 TCP 简单通信

1.C++ TCP编程流程服务端编程流程:用 socket 创建一个套接字;用 bind 给这个套接字绑定地址(即 ip+端口号)调用 listen 把这个套接字置为监听状态;调用 accept 函数从已完成连接队列中取出成功建立连接的套接字;在这个新的套接字上调用 send、recv 来发送数据、接收数据;最后调用 close 来断开连接释放资源即可。客户端编程流程:与服务器不同,客户端并不需要 bind 绑定地址,因为端口号是系统自动分配的,而且客户端也不需要设置监听的套接字,因此

2022-02-25 16:59:42 2118

原创 设计模式-单例模式

1.单例模式的定义确保一个类只有一个实例,并且提供一个全局访问点来访问这唯一实例;特点:一个类只有一个实例必须自己创建这个实例必须向整个系统提供这个实例2 实例2.1 创建方式:将构造函数私有化,这样能保证只能在类内进行实例化;实例对象设置为静态;设置获取实例对象函数;2.2具体实例...

2022-02-15 15:50:32 389

原创 设计模式--策略模式

参考:参考1策略模式定义多种处理同一种场景的不同算法,这些算法可在不影响用户的情况下互相替换。1.策略模式构成环境类(Context):持有一个具体的策略类的引用,提供给客户端调用。抽象策略类(Strategy):策略的抽象,一般定义接口。具体策略类(ConcreteStrategy):具体的策略实现,实现抽象策略类的接口。2. 代码实现抽象策略类,一般用于定义接口class abs_stratege{ virtual void a()=0;//实现方法接口}具体策略

2022-02-14 16:50:28 438

原创 设计模式--工厂类进阶

1 工厂模式逻辑图第一篇:工厂模式11.1 简单工厂模式1.2 工厂模式注:一个具体工厂只能生产一个产品;1.3抽象工厂模式注:一个具体工厂可以生产多个个产品;2工厂模式改进2.1 工厂模式缺点简单工厂模式在新增加产品的时候需要去修改工厂类,违反了开闭原则工厂模式以及抽象工厂模式在增加产品的时候需要去增加一个新的产品类,加大了代码量;2.2 工厂模式改进模板类工厂(参考:工厂模式进阶)具体思路:依旧是抽象工厂的组成形式(具体产品,抽象产品,具体工厂,抽象工厂)结构图如

2022-02-14 14:16:45 642

原创 设计模式--工厂模式

1 简单工厂模式1.1 简单工厂模式组成工厂:根据具体产品参数来创建实体抽象产品:还有产品的基类以及创建方法具体产品:提供产品参数,1.2 代码实现class AbsProduct//抽象产品类{ public: //具体实现方法};// 具体产品(可定义多个,继承基类产品)class realProduct :public AbsProduct{ public: //具体实现方法};class A :public AbsProduct{ pub

2022-02-13 23:00:32 329

原创 腾讯实习面试整理

出自:腾讯面试一面Linux指令怎么查看占用内存情况,怎么查看占用端口情况toplsof一个数组a[20][10]的首地址是100,问a[11][5]的地址是多少如题所指,其代表a[0][0]的地址为100;所以为100+11410+5*4=560;数组和链表的内存存储和插入数组存储连续,方便查询,但是不方便插入;链表存储不连续,不方便查询,但是方便插入;unordered_map和map的底层实现,以及使用场景如何选择unorde_map基于哈希表实现;map基于黑红树实现;

2021-12-21 19:19:14 346

原创 字节实习面经2

题目见这里:字节实习一面介绍 C++ 多态类在调用成员函数时,会根据调用的对象的不同去执行不同的函数;通过虚函数来实现;虚函数,在函数定义前加上virtual;C++ 类对象的初始化顺序,有多重继承情况下的顺序各个基类的构造函数;成员变量的初始化;派生类(类本身)的构造;注:析构函数的执行顺序与构造函数相反。若同一层次中同时包含虚基类和非虚基类,先调用虚基类的构造函数,再调用非虚基类的构造函数。同一层次中的非虚基类只调用一次。.如果派生类的成员与基类的某个成员同名,则派生类将在其

2021-12-12 16:11:50 2248

原创 WEB服务器代码解析-线程池

locker.h头文件#ifndef LOCKER_H#define LOCKER_H#include <exception>#include <pthread.h>#include <semaphore.h>// 线程同步机制封装类#endif定义互斥锁类// 互斥锁类class locker {public: locker() {//构造函数 if(pthread_mutex_init(&m_mutex,

2021-12-10 19:23:09 214

原创 字节实习面经

面经题目出自:国际化电商一面1.TCP中time_wait 状态出自四次挥手状态中第四次挥手等待状态为什么需要四次挥手状态:这个状态持续时间为报文在网络中存活时间*2;若服务器B为收到ACK,则会发送未收到的报文信息给客户端A让其重新发送;2.HTTP2.0的特性采用二进制传输;支持多路复用,一个HTTP请求能解决多个HTTp请求传输;支持头部压缩,通信双方会维护一张头信息表,此时HTTP只需传输索引;支持服务器推送,可预先向客户端发送需要的内容;3 HTTP的长连接和短连接如果

2021-12-09 20:05:49 1183

原创 类part2

14.3在类定义中实现成员函数inline在类的定义中实现的函数为内联函数;如下所示:public: void addhour(int tmphour) { Hour=Hour+tmphour; }成员函数末尾的const若在成员函数后面加入const则不能修改成员变量值;void noone()const{ Hour+=10; //错误,修改了成员变量;}mutable用mutable字符来修饰成员变量则可以修改成员变量mu

2021-12-08 22:02:25 566

原创 5.4-5.5

5.4服务器基本框架和事件处理模式5.4.1基本框架I/O 处理单元是服务器管理客户连接的模块。它通常要完成以下工作:等待并接受新的客户连接,接收客户数据,将服务器响应数据返回给客户端。但是数据的收发不一定在 I/O 处理单元中执行,也可能在逻辑单元中执行,具体在何处执行取决于事件处理模式。一个逻辑单元通常是一个进程或线程。它分析并处理客户数据,然后将结果传递给 I/O 处理单元或者直接发送给客户端(具体使用哪种方式取决于事件处理模式)。服务器通常拥有多个逻辑单元,以实现对多个客户任务的并发处理。

2021-12-03 20:37:55 1237

原创 5.2-5.3

5.2 Linux/Unix五种I/O模型在处理IO的时候,阻塞和非阻塞都是同步IO,只有调用了特殊的API才是异步的;多路复用时同步IO;五种IO模型阻塞非阻塞IO复用信号驱动异步IO1.阻塞 blocking调用者调用了某个函数,等待这个函数返回,期间什么也不做,不停的去检查这个函数有没有返回,必须等这个函数返回才能进行下一步动作。2.非阻塞 non-blocking ( NIO)阻塞和非阻塞是文件描述符的一个属性非阻塞等待,每隔一段时间就去检测IO事件是否就绪。没有就绪

2021-12-02 21:48:48 91

原创 14章 类 part 1

14.1成员函数、对象复制与私有成员14.1.1类的相关基础1.类的构成:成员变量以及成员函数;2.访问类的成员,如果用类的对象来访问,那么则是“对象名.成员名”;如果是对象的指针来访问,那么则是“指针名->成员名”;3 struct和class的区别:struct 和 class 都可以自定义数据类型,也支持继承操作。struct 中默认的访问级别是 public,默认的继承级别也是 public;class 中默认的访问级别是 private,默认的继承级别也是 private。当

2021-12-01 22:27:56 75

原创 5-1阻塞/非阻塞、同步/异步

阻塞/非阻塞、同步/异步典型的一次IO的两个阶段是什么?数据就绪 和 数据读写数据就绪:根据系统IO操作的就绪状态阻塞非阻塞数据读写:根据应用程序和内核的交互方式同步异步同步:调用函数之后,得到程序结果之后,立马往下执行(花费的是程序的时间);例子:买机票,打车去机场取机票(这个动作花费的是你自己的时间);编程较为简单;异步:异步IO接口(sockfd,buf,通知方式(一般是sigio信号)),需要通知方式,不用等程序调用函数返回结果,等待操作系统(内核)将数据放入buf之中,通知

2021-12-01 20:55:17 419

原创 4-33--4-35

4-33广播向子网中多台计算机发送消息,并且子网中所有的计算机都可以接收到发送方发送的消息,每个广播消息都包含一个特殊的IP地址,这个IP中子网内主机标志部分的二进制全部为1。a.只能在局域网中使用。b.客户端需要绑定服务器广播使用的端口,才可以接收到广播消息。// 设置广播属性的函数int setsockopt(int sockfd, int level, int optname,const void *optval, socklen_toptlen); - sockfd : 文件描述符

2021-12-01 17:43:03 2052

原创 4-29——4.32

4-29 epoll API以及应用epoll原理#include <sys/epoll.h>// 创建一个新的epoll实例。在内核中创建了一个数据,这个数据中有两个比较重要的数据,一个是需要检测的文件描述符的信息(红黑树),还有一个是就绪列表,存放检测到数据发送改变的文件描述符信息(双向链表)。int epoll_create(int size); - 参数: size : 目前没有意义了。随便写一个数,必须大于0 - 返回值: -

2021-11-30 16:52:00 88

原创 4-24--4-28

4-24 半关闭,端口复用半连接的API#include <sys/socket.h>int shutdown(int sockfd, int how);sockfd: 需要关闭的socket的描述符how: 允许为shutdown操作选择以下几种方式: SHUT_RD(0): 关闭sockfd上的读功能,此选项将不允许sockfd进行读操作。 该套接字不再接收数据,任何当前在套接字接受缓冲区的数据将被无声的丢弃掉。 SHUT_WR(

2021-11-29 22:02:32 1412

原创 4-20-4-23并发服务器,TCP状态转换;

要实现TCP通信服务器处理并发的任务,使用多线程或者多进程来解决。思路:一个父进程,多个子进程2.父进程负责等待并接受客户端的连接3.子进程:完成通信,接受一个客户端连接,就创建一个子进程用于通信。服务端代码:#include <stdio.h>#include <arpa/inet.h>#include <unistd.h>#include <stdlib.h>#include <string.h>#include &l

2021-11-28 19:25:16 1707

原创 网络编程4.15-4.19

4.15-4.16 TCP实现通信流程:服务端代码;// TCP 通信的服务器端#include <stdio.h>#include <arpa/inet.h>#include <unistd.h>#include <string.h>#include <stdlib.h>int main() { // 1.创建socket(用于监听的套接字) int lfd = socket(AF_INET, SOCK_

2021-11-27 17:19:50 863

原创 网络编程4.10-4.14

4.10字节转换函数当格式化的数据在两台使用不同字节序的主机之间直接传递时,接收端必然错误的解释之。解决问题的方法是:发送端总是把要发送的数据转换成大端字节序数据后再发送,而接收端知道对方传送过来的数据总是采用大端字节序,所以接收端可以根据自身采用的字节序决定是否对接收到的数据进行转换(小端机转换,大端机不转换)。网络字节顺序是 TCP/IP 中规定好的一种数据表示格式,它与具体的 CPU 类型、操作系统等无关,从而可以保证数据在不同主机之间传输时能够被正确解释,网络字节顺序采用大端排序方式。BSD

2021-11-26 21:52:42 287

原创 计算机网络编程4.6-4.9

4.6-4.7网络通信过程封装上层协议是如何使用下层协议提供的服务的呢?其实这是通过封装(encapsulation)实现的。应用程序 数据在发送到物理网络上之前,将沿着协议栈从上往下依次传递。每层协议都将在上层数据的基础上加 上自己的头部信息(有时还包括尾部信息),以实现该层的功能,这个过程就称为封装。封装过程:加头部和尾部;分用当帧到达目的主机时,将沿着协议栈自底向上依次传递。各层协议依次处理帧中本层负责的头部数据,以获取所需的信息,并最终将处理后的帧交给目标应用程序。这个过程称为分用(d

2021-11-25 21:56:28 944

原创 第四章 网络编程4.1-4.5

前三章需要掌握内容第一章1.静态库动态库的使用,编程2.虚拟地址空间3.文件描述符4.dup dup2 fcnl函数第二章1.进程状态转换2.父子进程的虚拟地址空间3.孤儿僵尸进程(wait函数,非阻塞)4.进程间通信的方式5.fork函数6.守护进程(后台一直运行的进;守护进程实现的步骤)第三章1.线程常用API;2.线程同步(互斥锁,读写锁)3.生产者消费者模型4.1网络结构模式cs结构简介:服务器 - 客户机,即 Client - Server(C/S)结构。C

2021-11-24 20:50:16 684

原创 3-11—14 多线程同步 part-2

读写锁◼ 当有一个线程已经持有互斥锁时,互斥锁将所有试图进入临界区的线程都阻塞住。但是考虑一种情形,当前持有互斥锁的线程只是要读访问共享资源,而同时有其它几个线程也想读取这个共享资源,但是由于互斥锁的排它性,所有其它线程都无法获取锁,也就无法读访问共享资源了,但是实际上多个线程同时读访问共享资源并不会导致问题。◼ 在对数据的读写操作中,更多的是读操作,写操作较少,例如对数据库数据的读写应用。为了满足当前能够允许多个读出,但只允许一个写入的需求,线程提供了读写锁来实现。◼ 读写锁的特点: 如

2021-11-22 11:07:01 460

原创 3.8-2.10 线程同步 part1

设计一个买票程序#include<stdio.h>#include<pthread.h>void*sell(void *arg){ int ticket=20; while(ticket>0) { printf("%ld is sellinf %d th ticket\n",pthread_self(),ticket); ticket--; } return NULL;}int main()

2021-11-21 19:58:27 783

原创 leetcode 24

方法一 迭代class Solution {public: ListNode* swapPairs(ListNode* head) { if(!head||!head->next) { return head; } ListNode*pre=new ListNode(0,head); ListNode*a=pre; while(a->next&.

2021-11-21 13:15:01 62

原创 3-6线程取消

#include <pthread.h>int pthread_cancel(pthread_t thread); - 功能:取消线程(让线程终止) 取消某个线程,可以终止某个线程的运行, 但是并不是立马终止,而是当子线程执行到一个取消点,线程才会终止。 取消点:系统规定好的一些系统调用,我们可以粗略的理解为从用户区到内核区的切换,这个位置称之为取消点。程序代码:#include <stdio.h>#include &

2021-11-18 14:00:39 70

原创 3-4 连接已终止的线程

/* #include <pthread.h> int pthread_join(pthread_t thread, void **retval); - 功能:和一个已经终止的线程进行连接 回收子线程的资源 这个函数是阻塞函数,调用一次只能回收一个子线程 一般在主线程中使用 - 参数: - thread:需要回收的子线程的ID

2021-11-18 11:18:34 481

原创 3-3终止线程

```cpp/* #include <pthread.h> void pthread_exit(void *retval); 功能:终止一个线程,在哪个线程中调用,就表示终止哪个线程 参数: retval:需要传递一个指针,作为一个返回值,可以在pthread_join()中获取到。 pthread_t pthread_self(void); 功能:获取当前的线程的线程ID int .

2021-11-17 19:44:33 58

多人聊天室代码(mysql以及redis简单应用)

Linux环境下运行,需要redis以及mysql以及相关连接件; 相关描述见:https://blog.csdn.net/qq_43108252/category_11651808.html

2022-03-02

空空如也

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

TA关注的人

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