自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创

平衡二叉树:(1)非叶子节点最多拥有两个子节点;(2)非叶子节值大于左边子节点、小于右边子节点;(3)树的左右两边的层级数相差不会大于1;(4)没有值相等重复的节点;

2021-03-17 09:25:32 140

原创 字符串按照指定字符串切割成数组形式

vector<string> split(string dst, string ch){ string::size_type pos; vector<string> res; int size = dst.size(); for (int i = 0; i < size;) { pos = dst.find(ch, i); if (pos < size) { string s = dst.substr(i, pos - i); res

2020-11-02 21:29:26 890

转载 Qt界面有时候点击但不能自动刷新的问题

转载:https://blog.csdn.net/jiedesheng/article/details/79481496重写showEvent函数void showEvent(QShowEvent *e){this->setAttribute(Qt::WA_Mapped);QWidget::showEvent(e);}

2020-10-30 14:11:04 1017

原创 sem_timedwait用法

1.函数签名int sem_timedwait(sem_t *sem, const struct timespec *abs_timeout);参数1:信号量参数2:绝对时间,最晚这个时候返回返回值:成功返回0。失败返回-1,并有对应的errno值补充:struct timespec { time_t tv_sec; //秒 long tv_nsec; //纳秒}2.具体实例struct timespec ts;clock_gettime(CLOCK_REALTIME, &amp

2020-10-23 09:05:33 4034 1

原创 唤醒fd

对于epoll_wait/poll/select等函数一般设置了一个超时时间。如果超时时间为0,那么在没有任何网络I/O时间和其他任务处理的情况下,这些线程实际上会空转,白白地浪费了CPU时间片。如果设置的超时时间大于0,在没有网络I/O事件的情况,epool_wait/poll/select等函数仍然需要挂起指定时间才能返回,导致其他的任务不能被及时的执行,影响其他任务不能被及时的处理,也就是说其他任务一旦产生,其处理起来具有一定的延时性。这样是不好的,该如何处理这些情况呢?其实这样是最好的,如果没有

2020-10-20 10:15:09 131

原创 RDB

1.内存快照Redis中除AOF的另一种持久化方法:内存快照。所谓内存快照,就是指内存中的数据在某一个时刻的状态记录。这就类似于照片,当你给朋友拍照时,一张照片就能把朋友一瞬间的形象完全记下来。对 Redis 来说,它实现类似照片记录效果的方式,就是把某一时刻的状态以文件的形式写到磁盘上,也就是快照。这样一来,即使宕机,快照文件也不会丢失,数据的可靠性也就得到了保证。这个快照文件就称为 RDB 文件,其中,RDB 就是 Redis DataBase 的缩写。和AOF相比,RDB记录的是某一时刻的数据,

2020-10-11 23:56:58 269

原创 AOF日志

1.AOF日志1.1 写后日志AOF日志为写后日志,Redis先执行命令,把数据写入内存,然后才记录日志。如下图所示:1.2 AOF日志记录的内容AOF日志里记录的是Redis收到的每一条命令,这些命令以文本形式保存。以记录"set testkey testvalue"命令为例,看AOF日志的内容。其中,"*3"表示当前命令有三个部分,每个部分都是由"$+数字"开头,后面紧跟着具体的命令、键或者值。“数字”表示这部分中的命令、键或者值一共有多少字节。例如,"$3 set"表示这部分有3字节,也就是

2020-10-09 23:30:05 767 2

原创 Qt程序开机自启动加载不了资源文件

1.首先贴出开机自重启代码///将路径写入到注册表中,电脑在开机的时候会自动执行该程序void appAutoRun(bool bAutoRun){ QSettings reg("HKEY_CURRENT_USER\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run", QSettings::NativeFormat); if (bAutoRun) { QString strAppPath = QDir::toNativeSeparators

2020-09-27 17:11:34 722

原创 6.mduo之EventLoop

介绍:EventLoop是初始分发器,其实就是一个reactor角色。它本身定义了一些规范,这些规范用于控制事件的调度方式,同时又提供了应用进行事件处理器的注册、删除等设施。它本身是整个事件处理器的核心所在,初始分发器会通过同步事件分离器来等待事件的发生。一旦事件发生,初始分发器首先会分离出每一个事件,然后调用事件处理器,最后调用相关的回调方法来处理这些事件。1.EventLoop.h文件///一个线程只能拥有一个reactorclass EventLoop : noncopyable{ publ

2020-09-14 19:59:15 174

原创 linux下emsdk编译ffmpeg问题解决方案

一、安装emsdk过程首先下载emsdk: git clone emsdk:https://github.com/emscripten-core/emsdk.git2.进入emsdk文件夹:执行./emsdk install latest然后出现了:被对方重置连接,导致安装失败然后各种检查环境,前置条件,没能解决。我在这里用的系统是centos,然后换成ubuntu进行同样的操作就没问题了,操作成功。别问为什么,俺也不知道。。。单纯做个记录。执行./emsdk activate latest

2020-09-14 09:25:37 1133 1

原创 linux之定时器

1.time_create函数:创建一个定时器对象#include <sys/timerfd.h>///创建一个定时器对象int timerfd_create(int clockid, int flags);参数:1.clockid:指定的时钟计数器,可选(CLOCK_REALTIME、CLOCK_MONOTONIC) 2.flags:TFD_NONBLOCK、TFD_CLOEXEC 可以同时选择CLOCK_REALTIME:系统实时时间,随系统实时时间改变而改变,从UTC197

2020-09-11 22:12:35 186

原创 5.muduo之TcpConnection类

介绍:1.TcpConnection.h文件///该类对象,客户端和服务器都会用到///这是一个接口类,所以不用暴露太多细节class TcpConnection : noncopyable, public std::enable_shared_from_this<TcpConnection>{ public: /// Constructs a TcpConnection with a connected sockfd ///用一个

2020-09-09 23:31:31 171 1

转载 糊涂窗口综合症

原文链接:什么是糊涂窗口综合症当发送端应用进程产生数据很慢、或接收端应用进程处理接收缓冲区数据很慢,或二者兼而有之;就会使应用进程间传送的报文段很小,特别是有效载荷很小。 极端情况下,有效载荷可能只有1个字节;而传输开销有40字节(20字节的IP头+20字节的TCP头) 这种现象就叫糊涂窗口综合症发送端引起的糊涂窗口综合症如果发送端为产生数据很慢的应用程序服务(典型的有telnet应用),例如,一次产生一个字节。这个应用程序一次将一个字节的数据写入发送端的TCP的缓存。如果发送端的TCP没有特定的指

2020-09-09 07:09:29 210

原创 4.muduo之TcpServer类

介绍:可以直接当成一个服务器了,你只需要设置loop,绑定地址,服务器名称,SO_REUSEPORT是否开启就行了。如果想要运用多个I/O线程池,在start()函数之前调用setThreadNum(int numThreads)设置线程池中的线程数就可以了.1.TcpServer.h文件//////该类即支持单线程也支持多线程///该类是一个接口类,所以不暴露太多细节class TcpServer : noncopyable{ public: ///线程初始化函数,并不一定需要 typ

2020-09-08 21:56:45 231

原创 3.mduo之Acceptor类

该类对象从属于TcpServer类对象。主要作用就是listen(),accept(),然后accpet()成功后调用NewConnectionCallback回调函数.1.Acceptor.h文件////// Acceptor of incoming TCP connections.///class Acceptor : noncopyable{ public: ///连接建立成功后将调用的回调函数 typedef std::function<void (int sockfd,

2020-09-07 22:30:20 119

转载 操作系统—陷阱、中断、异常

转载:https://blog.csdn.net/qq_30866297/article/details/52046655陷阱计算机有两种运行模式:用户态, 内核态。 其中操作系统运行在内核态,在内核态中,操作系统具有对所有硬件的完全访问权限,可以使机器运行任何指令;相反,用户程序运行在用户态,在用户态下,软件只能使用少数指令,它们并不具备直接访问硬件的权限。这就出现了问题,假如软件需要访问硬件或者需要调用内核中的函数该怎么办呢,这就是陷阱的作用了。陷阱指令可以使执行流程从用户态陷入内核(这也就是为什么

2020-09-07 16:13:45 1171

原创 2.muduo之Channel

Channel类主要作用:1.将文件描述符(可能是socket类型,eventfd类型,timefd类型,signalfd类型)封装,通过该类设置各种事件的回调函数(例如读回调,写回调,关闭回调等)。2.可以设置自己的监听事件类型,然后根据该类型更新poller对象(epoll或者poll)对该类的操作(例如添加,修改,删除操作)。3.根据自己监听到的事件类型触发回调函数。1.Channel.h文件//////一个能被选择的 I/O channel//这个类不拥有自己的文件描述符/// 这个文件描

2020-09-06 21:55:05 19048 1

原创 1.muduo之Socket类

前言:每篇阅读某个类的文章,我都会将头文件放在第一部分注释,cc文件放在第二部注释。仅当作我作为学习muduo库的记录。该类主要作用:Socket类其实就是对于一个调用过socket()函数所生成的文件描述符sockfd的一个封装,该类里面主要实现了bind()和listen()函数的功能,还有accpet()。还可设置sockfd的各种属性,比如开启Nagle算法,保活机制等,1. Socket.h头文件/// sockfd的封装类/// 销毁对象时会关闭sockfd/// 该类是线程安全的,所

2020-09-06 19:53:04 227

转载 reactor

在学习muduo之前,有必要先搞清楚reactor模式的含义。我觉得有一篇文章写的特别好,我就不复制粘贴了。Reactor模式详解。这边文章过后,我觉得基本能够理解reactor的基本流程了,以及工作线程池和Reactor线程池的作用了,有助于接下来理解muduo源码。...

2020-09-02 15:43:32 124

原创 muduo之序章

学习muduo的由来以及目的:最近想找一个网络库学习一下,因为其代码比较简洁,并且不用考虑到可移植性,所以最终选择了muduo了,个人认为阅读起来会比较方便理解一点,我主要是为了学习网络编程的一种思想。接下来我将会对一些主要的类进行剖析,在这里作为笔记进行记录。...

2020-09-02 15:31:28 80

原创 __attribute__

做个记录:https://nshipster.cn/attribute/

2020-08-27 19:25:51 75

原创 同步与异步,阻塞与非阻塞

POSIX对于同步I/O和异步I/O的定义如下:同步I/O操作导致请求进程被阻塞,直到I/O操作完成为止。异步I/O操作不会导致请求进程被阻塞。同步异步区分的关键在于将数据从内核空间复制回应用进程空间的这一过程是否阻塞进程。不管是阻塞还是非阻塞的I/O,当有数据可供消费时,在调用recvfrom()或read()将数据从内核复制回应用进程空间的这个过程中,该进(线)程是阻塞的,是被挂起的,因此他们都是同步的。只不过非阻塞I/O在无数据时,会立即返回,而非阻塞I/O不会。而异步的I/O连将数据复制到进程

2020-08-27 17:33:05 213

原创 linux下线程的真实id

每个进程都存在一个进程id。线程也有一个id(posix描述的线程id),类型为pthread_t,可以由pthread_self()获得,线程由线程库维护,其id空间是各个进程独立的,也就是说,不同进程下的线程可能拥有相同的id。真实id也叫tid(内核中的线程id),那么tid是怎么获得的呢?linux中其实没有直接可以获取tid的方法,但是我们可以自己定义。如下所示:#include <sys/syscall.h>#define gettid() syscall(__NR_gettid

2020-08-27 17:14:40 192

原创 select什么情况下比epoll快?

少连接,高并发。连接少意味着不会超过select 1024的上限,高并发意味着一次wait每一个连接都会来数据。把扫描有事件连接时的O(n)复杂度降至位O(1)。select的差距主要体现在每次内核O(n)的去遍历fd,用户也需要去遍历fd,造成效率低下。...

2020-08-10 17:58:39 770 2

原创 Linux之真实的、有效的以及被保存的用户和组ID

真实用户ID真实用户ID是指启动进程的用户的uid。它会被设定成该进程的父进程的真实用户ID,而且在exec调用期间不会变动。通常,登陆进程会将用户的login shell的真实用户ID设定成该用户的ID,有效用户ID有效用户ID是指正在运行的进程的用户ID。进行使用权限的确认时通常会检查此值。最初,有效用户ID会等于真实用户ID,因为当一个进程进行派生时,父进程的有效用户ID会被子进程继承。此外,如果进程发生exec调用,有效用户ID通常不会变动。但是exec()执行期间,可以看出真实用户ID和有效

2020-07-27 18:20:13 130

原创 随笔:TCP/IP的四元组、五元组、七元组

四元组源IP地址,源端口,目的IP地址,目的端口五元组源IP地址,源端口,目的IP地址,目的端口,协议号七元组源IP地址,源端口,目的IP地址,目的端口,协议号,服务类型,接口索引

2020-07-23 10:22:59 357

原创 文件IO

文件描述符:在对文件进行读写操作之前,需要先打开文件。内核会为每个进程维护一个打开文件的列表,该列表称为文件表。文件表由一些非负整数进行索引,这些索引称之为文件描述符。列表的每一项是一个打开文件的信息,包括指向该文件索引节点内存拷贝的指针以及关联的元数据,如文件位置指针和访问模式。3个通用的进程描述符(LinuxC标准库提供的三个宏,值分别为0,1,2),STDIN_FILENO(标准输入,通常指的是用户键盘),STDOUT_FILENO(标准输出),STDERR_FILENO(标准错误)。1. 打开文

2020-07-18 12:57:16 171

二叉查找树操作内容代码

二叉查找树的查找、插入、删除、建立操作

2019-04-17

空空如也

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

TA关注的人

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