自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

转载 如果持有互斥锁的线程没有解锁退出了,该如何处理?

本篇文章是做记录,以便后期查找使用。

2023-10-19 17:59:04 58

原创 json的使用和资源提供

json的使用和资源提供,pc和linux都能方便使用

2023-10-19 14:44:54 478

原创 基础组件(4) 字符编码Unicode原理

字符编码和字符集:字符编码:是一种规则,将字符映射为特定的字节或字节序列,以便计算机进行存储或者通信网络传递;字符集:是书写系统字母和符号的集合,也就是多个字符集合;二者的关系:通常某个特定的字符集,是采用特定的编码方式的。unicode字符集,有三种编码方式:UTF 是 Unicode Transformation Format 的缩写,意思是“Unicode 转换格式”,后面的数字表明至少使用多少个比特位(Bit)来存储字符。UTF-8:1-4字节来存储,是变长的编码方案;大端存储

2021-12-01 17:55:34 189

原创 高性能组件(4)try-catch实现

本文主要讲try catch的实现。面试微软会遇到。try/catch/finally:调试,捕获,最终try_catch用法:比如:连接数据库时有可能失败try{connect_spq(); //throw 抛出个异常string.copy(); //函数内部抛出异常}catch(){//捕获异常}finally(){//不管你有没有走,这一步一定会走}setjmp/longjmp函数:1、可以跨越函数的跳跃,可从函数A跳到函数B;2、调用longjmp函数执行完后,

2021-11-22 17:45:47 607

原创 高性能组件(2)锁与原子操作

本文主要介绍各种锁和原子操作。背景:多个线程任务执行时,不可避免的会共用些资源,这些资源就是临界资源多线程使用临界资源时,会出现无可预料的情况,会有副作用的情况,所以给临界资源加上锁。有什么副作用呢?多个线程,对于同一个变量操作的时候由于线程的切换,会导致汇编语言一个流程中,就切换到另一个线程走流程,第一个流程被终端了这个就是副作用,就是两个线程执行却只实现了一个线程的结果。理想中不同线程对idx++操作,应该是如下:但实际大部分是这样:为了汇编的流程不被切断,我们应该将其锁起来。

2021-11-19 20:55:54 243

原创 池式结构(4) 请求池

本文主要讲异步请求池的实现和原理。什么是异步?和阻塞、非阻塞有什么区别?同步:一请求就等返回结果,没有等到就一直等异步:只管发送请求,进程不需要一直等下去, 而是继续执行下面的操作阻塞和非阻塞是针对fd的状态,有数据就返回,没有数据就挂起,这是阻塞状态;非阻塞就压根不管,直接返回。阻塞【挂起】和非阻塞是线程的一种状态,同步和异步是指的是线程执行方法的一种方式,当然同步执行时,一般都伴随着线程的阻塞。背景:客户端与mysql服务器连接后,发送完一个请求没有等到返回结果,要是再要发送请求,只能

2021-11-18 22:28:42 643

原创 高性能组件(1)定时器-难点

本文将介绍服务器中经常使用的定时器方案:业务场景:什么时候用定时器?1、心跳检测2、游戏中的技能冷却定时器的实现方式:1、在nginx和redis当中,将网络事件和时间事件放在一个线程中处理:通过epoll_Wait函数,设置最后参数timeout = 最近任务的时间 - 当前时间,即可实现定时器。在timeout时间内,线程会阻塞。时间到了,获取相关数据进行处理;// 第⼀种while (!quit) { int now = get_now_time();// 单位:ms int t

2021-11-18 21:27:55 114

原创 池式结构(3)

本文主要讲内存池的原理和实现池式结构的作用:主要起到缓冲作用。也就是需要使用资源时,在已有的资源结构中去拿,避免重新创建资源。背景:在网络数据中,建立io连接后,recv收到数据后,会讲数据放置在buffer中。若数据周期较长,或者将处理数据进行解耦,放置在另一个线程中处理,这样buffer就是不可用的。我们通常会malloc一个内存,将数据拷贝进去,再在新线程中 处理数据。问题:当大量io事件发生时,会出现:1、不利于内存管理;2、内存碎片;什么是内存池?拿取内存时,从内存池中拿取内存

2021-11-17 19:30:20 141

原创 池式结构(2)

本文主要将线程池的原理和实现线程池的应用场景主要是要开线程的都可使用。1、写日志2、对服务器业务计算,开线程的时候都可用线程池3、增删改查crud线程池的定义:就是线程的集合,这些线程是任务的执行队列,任务从任务队列中获取。组成:1、任务队列2、执行队列3、管理组件(让任务队列和执行队列有秩序的工作)管理组件如何实现?1、加锁2、条件变量在网络数据的处理过程中:1、检测IO世家是否就绪(epoll)2、对IO进行读写操作(recv/send)3、对数据进行解析与操作(pa

2021-11-17 14:13:18 75

原创 池式结构(1)

池化技术:定义:能够减少创建资源的次数,在高并发下能够提升效应效率 的技术。使用池化技术的背景:对象创建时间⻓;对象创建需要⼤量资源;对象创建后可被重复使⽤本文主要讲数据库连接池背景:单个连接有什么问题,流程是怎样的?目的是:连接到数据库服务器,执行sql语句。流程:1、tcp连接;2、mysql认证(账号和秘密给服务器);3、执行sql语句;4、MySQL关闭;5、tcp四次挥手;本质为了执行一条sql语句,但流程太长;若是有大量的sql语句要执行,则会耗费大量资源

2021-11-16 19:00:22 1499

原创 git使用方法

git与svn的区别:分布式:git,除了远程仓库外,每个电脑都有本地仓库备份,和远端服务器没有连接仍可工作。建立连接后,将改动推送到服务器中即可。数据一致性(推送到远端,最终保持一致)、可用性(断开网络也可用)、分区容错性(建立连接后其他客户端也可拉到代码)。集中式:svn,有服务器管理所有源代码,客户要和服务器连接,连接断开就无法工作。ssh原理有公钥和私钥(非对称加密方案),公钥发送到远端,私钥在本地,每次提交都是提交内容与私钥进行加密,再提交到远端。远端会拿公钥进行解密。拉取数据时,

2021-11-15 20:52:02 466

原创 TCP网络编程(八)

TCP协议栈与posix apiTCP协议栈主要关注三个方面1、建立连接:三次握手2、传输过程3、断开连接:四次挥手建立连接过程解析:服务端:tcp建立连接时,server端需要保持客户端的信息,会在半连接队列中存储;当client收到server的syn和ack包后,返回一个信息给server,server收到后检测ip/port信息,若在半连接队列(syn队列)中找到,就将节点移动到全连接队列(accpet队列)中(三次握手的最后一步完成后)。只有进入到全连接队列中,accept才能处理

2021-11-15 20:24:39 1345

原创 linux系统运行时命令参数

做服务器开发,有很多Linux命令需要知道,这里我给记录下,以便后期查找。grep搜索字符多个⽂件中搜索grep login ImUser.cpp MsgConn.cpp找出⽂件中包含 login的⾏,打印出⾏号,并显示前后3⾏,并忽略⼤⼩写grep -C 3 -i -n login ImUser.cppfind查找⽂件find /mnt -size +20K ##查找/mnt⽂件⼤⼩⼤于20k的⽂件find /mnt -size -20K ##查找/mnt⽂件⼤⼩⼩于20k的⽂件3 ls

2021-11-08 19:31:06 744

原创 设计模式(一)

学习设计模式之前必须明白一点:设计模式不可滥用,其是在特定环境,针对重复出现的特定问题,经过验证的解决方案;换句话说,如果对行业不是特别熟悉,变更点和稳定点不明确时,不要滥用设计模式,我们可以学习其封装的思想。设计原则比设计模式更重要。设计原则依赖倒置原则:高层模块、底层模块不相互依赖,而是应依赖抽象;具体实现应该依赖抽象,而不是抽象依赖具体实现。举例:本田、丰田公司都想要个自动驾驶系统,那么自动驾驶设计公司就要针对不同的客户设计不同的系统,这样很麻烦。如何规范化呢?应该出⼀个⾃动驾驶⾏业标准

2021-11-08 17:24:56 75

原创 TCP_网络编程(三) tcp如何实现websocket协议

tcp如何实现websocket协议websocket使用场景流程如何验证合法性websocket使用场景当server主动给client发送数据时。思考:reactor+websocket如何封装?流程server发给client数据的前提是:确保client与server已连接。连接后,client会发送握手数据给server来验证合法性。所以websocket中的数据是两类:1、握手数据2、握手后双方发送的通信数据。如何验证合法性...

2021-03-22 14:08:28 1031

原创 TCP_网络编程(二) epoll的管理reactor

epoll的管理reactorepollepoll如何使用epoll的et与ltepoll的底层原理reactor如何封装成reactor代码实现epollepoll如何使用1、epoll在服务器底层使用时,一定会和一个死循环一起。2、关闭一个fd时,记得也要从epoll中删除。close(clientfd);ev.events = EPOLLIN;ev.data.fd = clientfd;epoll_ctl(epfd, EPOLL_CTL_DEL, clientfd, &ev)

2021-03-20 18:29:49 198

原创 git的基本认识理解

git的认识git四个工作区域git工作流程操作流程文件的四种状态git四个工作区域workspace:工作区,就是放置代码的文件夹index/stage:暂存区,用于临时存放改动的文件,事实是一个文件,保存即将提交到文件列表信息Repository:本地仓库,存放提交到所有版本的数据,其中HEAD指向最新放入仓库的版本;Remote:远程仓库,也就是托管代码的服务器;git工作流程操作流程1、工作目录中修改、添加文件;2、将相关文件add早暂存区域;3、将暂存区域的文件commit

2021-02-15 20:13:43 114

原创 TCP_网络编程(一)

TCP_网络编程TCP编程方式二级目录三级目录UDP并发二级目录三级目录socket是什么?二级目录三级目录sigIO 信号如何工作的?二级目录三级目录select/poll/epoll二级目录三级目录TCP编程方式二级目录三级目录UDP并发二级目录三级目录socket是什么?二级目录三级目录sigIO 信号如何工作的?二级目录三级目录select/poll/epoll二级目录三级目录...

2021-02-13 23:05:38 128 1

原创 数据结构与算法(五) 缓存穿透和布隆过滤器

缓存穿透缓存穿透需求定义解决方案布隆过滤器定义特点原理其他方案map/setunordered_map三级目录缓存穿透需求从海量数据中查询某字符串是否存在。定义在海量字符串数据中查找是否存在某个字符串时,server端会发出请求数据,此时先访问redis缓存数据库,若有此数据就返回,若无就访问落盘数据库Mysql。若mysql不存在就直接返回,若存在就将数据写入redis中,以便下次查询此数据可直接访问redis。若有黑客利用此漏洞发送大量请求数据,那最终的数据压力还是积累在mysql中。发

2021-01-17 20:01:21 138

原创 数据结构与算法(二) 排序

数据结构与算法 排序希尔排序原理——分组代码实现快速排序原理——大数在基准数右边,小数在基准数左边代码实现KMP算法原理三希尔排序原理——分组希尔排序在数组中采用跳跃式分组的策略,通过某个增量将数组元素划分为若干组,然后分组进行插入排序,随后逐步缩小增量,继续按组进行插入排序操作,直至增量为1。希尔排序的基本步骤,在此我们选择增量gap=length/2,缩小增量继续以gap = gap/2的方式,这种增量选择我们可以用一个序列来表示,{n/2,(n/2)/2…1},称为增量序列。代码实现/*

2021-01-17 17:19:02 117

原创 数据结构与算法(三) 红黑树与二叉查找树

数据结构与算法三 红黑树和二叉树红黑树定义和性质应用红黑树的操作创建代码左旋代码实现:右旋代码实现添加删除二叉排序树性质优点缺点实现代码红黑树定义和性质R-B Tree,全称是Red-Black Tree,又称为“红黑树”,它一种自平衡的二叉查找树。红黑树的每个节点上都有存储位表示节点的颜色,可以是红(Red)或黑(Black)。性质:应用用途运用红黑树主要用其两个性质:A.通过键值对方式存储信息运用:1、多个客户端与服务器建立链接时,此时链接为socket实质就是一个int型数字。但是

2021-01-17 17:17:42 213

原创 数据结构与算法(四) B-树 B+树

数据结构与算法 B-树 B+树(一)B-树概念规则代码B-树的添加B-树的分裂背景拆分流程代码B-树概念很多文章把B树和B-tree理解成了两种不同类别的树,其实这两个是同一种树。B树和平衡二叉树稍有不同的是B树属于多叉树又名平衡多路查找树(查找路径不只两个),数据库索引技术里大量使用者B树和B+树的数据结构。规则一颗M阶B树T,满足以下条件((注:M阶代表一个树节点最多有多少个查找路径,M=M路,当M=2则是2叉树,M=3则是3叉))每个结点至多拥有M课子树根结点至少拥有两颗子树除了根结

2021-01-16 19:14:01 178

原创 数据结构与算法(一) 链表

数据结构与算法(一)链表链表定义作用底层结构链表的分类单链表结构头结点尾结点时间复杂度循环链表定义双向链表算法求环形链表入口点如何改变文本的样式如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一个注脚注释也是必不可少的KaTeX数学公式新的甘特图功能,丰富你的文章UML 图表FLowchart流程图导出与导入导出导入链表定义作用链表:通过指针将零散的内存块链接起来。底层结构结构:内存块:为链表的“结点”,里面存储了

2021-01-09 19:38:49 209

原创 Golang学习总结

记录学习go的笔记和难点

2020-12-08 22:23:31 125

转载 2020-11-17

C++11 std::thread在类的成员函数中的使用#include <thread>#include <iostream>class Wrapper { public: void member1() { std::cout << "i am member1" << std::endl; } void member2(const char *arg1, unsigned arg2) {

2020-11-17 16:29:54 87

原创 Unicode与UTF8相互转化(使用MultiByteToWideChar)

Unicode与UTF8相互转化(使用MultiByteToWideChar)链接:https://www.cnblogs.com/findumars/p/6206177.html

2020-05-05 22:15:36 650

原创 git更新有冲突的解决方法

背景:git上有大量代码变更,更新后会有很多改动,此方法是避免大量手动修改冲突。流程:1.右键->Git Sync,出现界面后,先点击Stash Save,将本地的改动先保存起来;2.在Remote Branch选中master,点击pull,即可从master中更新代码下来;3.点击Stash Save框处的下拉列表:Stash Pop,即可将更新的代码与本地的代码自动...

2020-05-05 22:04:07 2192

原创 指针矢量

背景:在容器中存储对象的指针释放内存比较麻烦,想要找一个简单方便的方法能够释放内存。for(vector<int*>::iterator it = vecInts.begin(); it != vecInts.end(); ++it){ delete *it;}更好的方法,避免使用迭代器来释放指针指向的内存空间。改为new一个数组,用指针来控制内存,进行相关的...

2020-05-05 21:48:49 117

原创 qt调试问题

安装顺序是vs2015,win10sdk, qtCreator ,结果运行程序出现:Unknown debugger type "No engine" Unable to create a debugger engine of the配置时没有自动匹配cdb.exe,下面这个链接告诉你如何操作。https://www.ixxin.cn/2017/04/18/qt5donotdebug...

2020-04-29 20:56:22 158

原创 音视频 环境搭建 没有生成ffmplay

1. ubuntu 16.4下安装sdl库sudo apt-get install libsdl1.2-dev (比较大,10M左右)附加包:sudo apt-get install libsdl-image1.2-devsudo apt-get install libsdl-mixer1.2-devsudo apt-get install libsdl-ttf2.0-devs...

2020-04-15 21:47:00 386

原创 MFC非模态对话框与主对话框怎么传值

一、非模态对话框的创建参考https://www.cnblogs.com/wpnan/p/4111036.html在非模态对话框中定义一个(void*)m_pMain,这个指针指向父对话框,在子对话框操作时通过m_pMain将值修改到父对话框中。例如:在父对话框创建子对话框时:CSetupDlg*pSetupDlg=newCSetupDlg;pSetup...

2020-04-14 11:35:30 1370

原创 CString使用技巧,以及与char* string之间的转换

一、CString和多种数据之间的转换比较在MFC工程中,通常通过控件取得的值都是CString类型。后期要和其他类型的值比较的话转换比较复杂,我们最好将其他类型的值转为CString,再将其比较最好。(1)int、float和double这些数字类型转换为CString字符串  %c 单个字符  %d 十进制整数(i...

2020-04-14 11:24:28 156

原创 vector的一些使用注意项,清空和容量初始化

一、vector的容量和大小size()是分配容器的内存大小,而capacity()只是设置容器容量大小,但并没有真正分配内存。打个比方:正在建造百的一辆公交车,车里面可以设置40个座椅(reserve(40);),这是它的容量,但并不是说它里面就有了40个座椅,只能说明这部车内部空间大小可以放得下40张座椅而已。而车里面安装了40个座椅(resize(40);),这个时候车里面才真正有了...

2020-04-14 10:55:18 2075 1

原创 模板当中.hpp的由来,解决了什么问题

编写函数模板时,编译遇到的问题:无法解析的外部符号"void _cdel func<int>(int &)"(xxxxx),该符号在_main中被引用。代码如下:.h文件的设置//hppDemo.h#pragma oncetemplate <typename T>void func(T &v);.cpp文件的设置//hppD...

2020-04-12 11:57:01 522

原创 三大系统,让学习不靠意志力

Day5总结:曾经成功坚持下来的学习是学韩语,当时是在外面报班学习,还有一个要考到证的目标坚持了两年完成了学习任务; 现在学习过程中几乎没有成就感,对学习没有上瘾,学习完视频后没有做笔记,而且会把视频都删掉,在工作中遇到问题并没有解决,造成了自己有一种学习没有什么用的错觉。后期要修改学习方法,比如看实体书时定一个星期看完的计划,细到每天看多少页;看技能书时,定一个月看完第一遍的目标,半个...

2020-03-28 15:57:28 203

原创 将知识内化成能力:智慧和能力是指对知识的处理和运用

Day4:大多数成功人士,擅长找“师傅”,由专家告诉你一个领域的最核心是什么,从而让你快速入门。师傅大都喜欢有拼劲和决心把事物完成的,表现出有能力的,自己要变成那样的人,让他们愿意来指点你; 跟着视频学习敲代码时,有时候并不清楚学习了能做什么。很多时候也没有什么概念,以后学习相关教程时,可以先思考下,学了这个可以干嘛,里面的知识点要及时做思维导图记录下来。以前学习过的也可以复习一...

2020-03-28 15:54:27 309

原创 天赋的表现

圈外Day3:S:工作上的任务觉得自己即使以前没有接触过的知识,最终也能够将任务完成; I:有目标的学习,自己就会很有动力,会安排规划好学习的时间和计划; G:有目标的学习,可以做到不玩各种社交软件,也不会觉得辛苦; N:大学的时候利用课余时间学好了韩语并考取了相关证书,但在工作中也没有用到的地方,希望以后能有机会使用到。只有两个人的采访,一个我妈,一个大学室友,综合...

2020-03-28 15:50:05 190

原创 Windows和Linux系统之间配置共享

Windows和Linux系统之间配置共享:通过共享就不需要做上传代码的操作。之前进行Linux与Windows之间配置共享出现了:在windows环境中,通过linux的ip访问其中的共享文件,在其中新建文件,在Linux环境中却无法找到新建的文件,原因是在配置文件中没有设定好路径。配置共享的操作流程:(Linux向Windows共享)1.转到root权限 ,安装samba$ s...

2020-03-28 15:40:51 317

原创 什么决定了自身价值?

Day2总结:对自己的工作没有清晰的认识。以前求职被拒都说是你没有相关编程的经验,所以自己学相关的知识,想多攒点经验;后面跳槽时有一家公司说:“你只是有编程的经验,通过面试你的口头表达能力和试卷的相关分数表现,只能给你定这个价位。” 遇到这种情况,自己真的很懵,觉得我怎么做都满足不了你们的条件。导致自己对程序媛这份工作有了误解,觉得自己有经验,学习了相关知识技能就可以了,我不管你...

2020-03-20 11:37:12 179

原创 冰山模型学习

标题Day1学习总结:自己是一名程序媛,在职业生涯中很迷茫:自己的工作完成了却得不到认可。领导觉得我能力不够,完成工作时间过长。之前我更多是追求一个简单、有爱的环境,觉得工作的标准就是将任务完成,尽力避免冲突,在事业上也没有什么规划,没有什么追求,其实说实话我是真的不知道要追求什么; 领导不认可我,觉得我完成工作时间周期长,话说不清楚。根据冰山模型自我分析,工作周期长的原...

2020-03-19 20:37:54 584

无法打开包括文件:“stdint.h”: No such file or directory

解决方案】 1. 去http://download.csdn.net/download/liubing8609/10046490下载“inttypes.h+stdint.h”压缩文件。 2. 解压后把inttypes.h和stdint.h放到vc的include目录就可以了。我安装的是VS2008,安装到的默认位置,因此include的路径就是:C:\Program Files\Microsoft Visual Studio 9.0\VC\include

2020-11-30

空空如也

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

TA关注的人

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