自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 c++ volatile

含义  这个关键字的含义就是代表这个变量是不可预期地可能会突然值就会被改变,编译器不要对它做任何假设c/c++标准对volatile的描述C 语言:Every access (both read and write) made through an lvalue expression of volatile-qualified type is considered an observ...

2020-04-25 19:31:04 526

原创 端口复用

端口复用Linux 3.9以上  使用 so_reuseport 选项即可Linux 3.9以下非listen态的端口复用  so_addrreuse 解决listen态的socket  多个进程accept 同一个listen_socket实现端口复用惊群  Linux 2.6以下是有惊群效应,当一个连接到来时,内核会唤醒该listen_socket上调用accept函数的所有...

2018-11-27 15:14:22 608

原创 网络模型同步异步与I/O模型同步异步

理解I/O模型的同步与异步网络 I/O 的同步与异步跟网络模型的同步与异步不同。在网络 I/O 接口中,有阻塞、非阻塞、多路复用、信号驱动、异步I/O五中I/O模型。网络I/O分为俩步,第一步等待条件就绪,第二步进行真正的数据I/O也就是把socket接受的数据搬移到应用层buffer中。那么这五中I/O模型中,前四种的第一步骤各有不同,但是第二个步骤都一样的都需要我们自己去I/O,但是异步...

2018-10-13 20:27:48 796

原创 Socket条件就绪

读文件描述符就绪当前接受缓冲区的数据量大于SO_RCVLOWAT(接受低水位线,默认1字节)收到FIN段该socket 上产生了一个未处理的errorlisten_socket的完全连接队列有相应的节点读文件描述符就绪发送数据大小大于SO_SNDLOWAT(发送缓冲区低水位线默认2048)半关闭半打开连接,直接再次写入,条件也就绪并触发SIGPIPE(默认半大开半关闭第一...

2018-08-12 01:06:47 413

原创 C++ pimp技巧

概念这个技巧可以降低编译依赖pimp实现A.h#ifndef A_H // 一定要加这个否则重复展开导致错误#define A_H#include "B.h" class ID::IDPimp{ // 类内声明,类外定义,防止直接访问实现细节 public: void print() { cout << "真正的实现" <&...

2018-07-25 15:49:37 1669

原创 缓存局部性应用与cacheline

缓存局部性  由深入理解计算机操作系统一书中,我们可以知道,计算机读取数据的时候并不是直接访问内存。而是先访问缓存,如果缓存不中,再去访问TLB,然后如果不中,才一级一级页表去访问内存。   此片文章主要针对缓存,那我们如果写的代码中是顺序访问的,cpu在读取数据的时候会预读数据到cache中,这样我们命中cache的几率就越大。CacheLine是Cpu Cache的最小缓存单位,x86结...

2018-03-09 13:55:41 1055

原创 基于tcp的C/S模型

基于TCP/ip模型下的c/s交互模型tcp网络通信的小知识  1.因为tcp是面向连接的,所以在写基于tcp服务器的代码时,要有listen套接字和accept套接字,而基于udp模型的代码,并且udp客户端直接调用 recvfrom/sendto 直接通信即可,不用调用connect函数,这也分别体现出了它们的特性tcp面向连接,而udp则是无需连接。   2.对于read在网络...

2018-02-07 22:52:50 5697

原创 线程局部存储(TLS)

介绍#include int pthread_once(pthread_once_t *once_control, void (*init_routine) (void));   1.该函数可以保证在多线程的环境下 , 可以保证 init_routine 函数指针指向的函数只被调用一次。    2.once_control参数需要通过 PTHREAD_ONCE_INIT

2018-01-22 18:32:43 516

原创 阻塞/非阻塞 I/O 同步与异步

网络I/O模型阻塞I/O模型   阻塞I/O就是,如果I/O条件不就绪的话,那么进程将一直被阻塞住,只有数据到达(I/O条件就绪),进程才从可中断睡眠状态到达就绪态,然后被操作系统调度,然后从函数中返回。非阻塞I/O模型 非阻塞I/O,调用进程并不会被阻塞,当I/O条件不就绪的情况下,它会一直轮询,返回报错EAGAIN,当数据到达后,进行实际的数据I/O。多路复...

2017-12-05 19:34:17 201

原创 tcp 的连接队列

连接队列  它指的就是tcp状态节点的队列。tcp 状态分俩种,一种是完全连接状态即(established) , 一种是半连接状态(SYN_SEND 或 SYN_RECV)。   对于服务器来说,listen状态的节点当收到syn同步报文段后,会进行三次握手,当三次握手完成后,就生成一个 established 节点放到完全连接队列中,本质上 listen状态的节点是不负责具体的通信的,它并不接

2017-11-30 16:03:02 612

原创 ELF文件格式与动态链接/静态链接与动态库/静态库 (Linux下 可执行文件的格式)

ELF文件格式  在Linux下,可执行文件/动态库文件/目标文件(可重定向文件)都是同一种文件格式,我们把它称之为ELF文件格式。   虽然它们三个都是ELF文件格式但都各有不同:   可执行文件没有section header table 。   目标文件没有program header table。   动态库文件俩个 header table 都有,因为链接器在链接的时候需要...

2017-11-08 17:33:32 7347

原创 Linux ext2文件系统

硬盘  在一个硬盘在Linux下,被虚拟成文件。在/dev目录下,实体机是/dev/sd[a-p],虚拟机下是/dev/vd[a-d]。总体来说第一个硬盘被虚拟的文件总体来为/dev/sd[a-p][1-128]。(不过我的虚拟机下的,/dev目录下的文件是/dev/sda)。   硬盘是由分区和磁臂构成。每次写入数据的时候,磁臂旋转到相应的磁道上,对其读写数据。   何为分区呢?列如我的

2017-10-24 19:18:04 454

原创 为什么要Time_wait

Time_wait啊,老哥们肯定会想,time_wait什么鬼? 为毛我主动断开tcp连接。发完最后一个ACK后不能直接断开连接啊,我能做的都做了。但是….. 老铁们你们想一下,ACK丢包是不会重传的,但是FIN呢? 最后被动关闭的一直要是收不到ACK它会怎么想,它肯定认为FIN包丢包了,那怎么样,重发呗。 重发之后呢,如果对端一直不会回复ACK,那么重传一定次数后就会发送重置报文段然后断开连接

2017-09-23 17:21:04 2725 1

原创 epoll

epoll的三个系统调用int epoll_create(int size); 它会创建一个epoll模型在内存中,创建成功后返回该模型的文件描述符。size表最多能注册多少个文件描述符,在Linux 2.6.8 版本之后不在关心。int epoll_ctl(int epfd,int op,int fd,struct epoll_event*event)epfd :epoll模型的文件描述符。

2017-07-13 12:54:38 536

原创 常见排序之逻辑风暴与视觉冲击

排序的分类插入排序  在一组数据中,把无序数据一个一个插入到有序序列中(刚开始的时候默认无序数列中第一个元素为有序数列),并每次插入时通过把元素不断前后搬移使之排成有序序列。不断插入无序数列的数据到有序数列,最终无序序列成为有序序列。希尔排序  希尔排序是在插入排序中进行了改进,每次排序时都定义了个gap(它为分组中元素的偏移量)。每次进行排序时,将无序数列分为多个分组,将

2017-07-02 22:50:46 728

原创 C++对象模型之继承与多态的探索

多态在C++中继承和多态为它的俩大特性:那么对于我们常说的动态多态,它是如何形成的? 通常我们都会说应用赋值兼容规则,让一个Base类指针或引用指向一个派生类对象,那么当我们在基类中定义出一个虚函数,在派生类中我们对它进行重写后。当我们用指向派生类对象的基类指针调用这个函数时,就会发生多态,当指针指向对象不同时,它就会调用不同类中的该函数。那么何为赋值兼容规则呢,为什么Base类指针就可以指向

2017-06-29 19:37:34 508

原创 守护进程

守护进程 它是特殊的进程。它独立于控制终端并周期性的执行某种任务或等待处理某些中断事件。其他进程都是在用户登录或运行程序时创建,在运行结束或用户注销时终止(因为用户注销就代表着会话注销,则这个会话中所有的进程都会终止)。 在Linux系统启动时,会启动很多系统服务进程,这些进程就是守护进程。通常为用户提供服务。我们可以通过ps axj 指令查看到当TPGID(前台进程组id)为-1时都为没

2017-06-29 18:28:37 403

原创 Linux 下多线程的消费者-生产者模型

消费者-生产者模型    所谓这个模型指在ipc时,由扮演的生产者进程产生数据,由扮演消费者的进程去拿走数据。    这个模型是由3种关系俩种角色一个场景所描述而成。    三种关系指:    消费者-消费者  --->  互斥    生产者-生产者  --->  互斥    消费者-生产者  --->  同步与互斥    俩种角色指:    消费者与生产者

2017-06-07 17:29:17 751

原创 B-树

B树    它是多叉平衡树。      我们知道二叉搜索树、平衡二叉树、红黑树都是动态查找树,典型的二叉搜索树结构,查找的时间复杂度和树的高度相关为O(log2N)。       当我们查找时数据时一般可分为如下三情况:             数据无序     ----->     线性搜索 O(n)             有数数据     ----->     二分查找

2017-06-05 15:00:35 369

原创 类的二三事

类 类的基本思想就是数据抽象和封装。数据抽象依赖于接口和实现。接口指类外成员对象可使用的函数接口。实现指类的成员函数和成员变量。封装实现了接口和实现的分离。类本身就是一个作用域。类外访问,可以通过作用域的限定符和成员访问符来进行访问。能否访问类的成员依赖于,该成员被什么访问限定符修饰。访问限定符:(1) public:它指公用,被它修饰的类成员在类外可以访问。(2)protec...

2017-04-07 22:14:57 448

原创 C++中的继承

何为继承?      何为继承?在现实生活中继承这个词很常见。继承意志,继承父母留给我们的财产。继承在我们生活中很常见。在C++中继承是其一大特性。      面向对象程序设计(OOP)的核心思想是数据抽象、继承和动态绑定。      继承(inheritance)是面向对象程序设计使代码可以复用的最重要的手段,它允许程序员在保持 原有类特性的基础上进行扩展,增加功能。这样产生新的类,

2017-02-25 20:49:26 572

原创 服务端缓存思考

缓存设计首先缓存设计。我们怎么设计一套缓存呢。大致的套路基本上都是一个LocalCache,一个分布式Cache (Redis) ,大体的架构图将像下面所示。LocalCacheRedisDBkafkaLocalCache Miss 访问Redis,拿到了keyRedis Miss Key访问DB 获取数据将DB数据更新到Redis中消费类似Binlog的文件,将更新key写到kafka集群...

2019-12-28 22:56:29 298

原创 类权限的理解

private / protected这俩个访问限定符,只是限定直接类外访问类内数据成员。但是不代表声明了private 就没办法在类外访问 相应的成员,如下面的democlass Test { public: int& Get() { return a; } private: a; };static 成员函数static 成员函数没有this指...

2019-07-16 18:46:50 319

原创 动态库的坑

动态库的坑今天想不重启程序,直接替换掉线上的动态库。结果程序崩溃了。最后发现经查询才发现,我直接使用 cp new.so target.so 的方式去替换。因为 cp 并不会产生新的文件,这相当于直接把 new.so 的内容覆盖掉了,那么线上程序这个时候如果进行 dlclose dlysm 关于该动态库的API操作就会发生问题,因为文件内容已经更改了。解决方案采用 mv + cp 或者...

2019-06-25 18:01:17 701

原创 c++ 迭代器

iterator catagoly迭代器种类input 向后读output 向后写forward 向后读写bidrectional 先后读写random 随机读写advance 与 next除了random 种类的迭代器,其他的都无法随机访问,但是STL算法为我们提供了随机访问的机会,就是通过advance 和 next函数。不同点1 首先语法不同,advance...

2019-06-17 17:21:28 168

原创 c++ 单元测试的权限控制

权限控制c++ 写单测的时候,可能UT里面想测 类的private 的接口,以下有俩种方式方式1-Dprivate=public -Dprotected=public方式2-fno-access-control总结g++ 官方推荐方式2。在高版本 ,比如我在gcc 5.1 中,包含 < sstream > 头文件的时候就会报错。std::basic_stringbu...

2019-06-12 11:07:27 1470

原创 c++11 右值引用

右值引用在c++ 中能通过 & 取到地址的变量都是左值,不能的都是右值。传统c++ 中引用必须是左值,即使 const T & (常量引用),它也是编译器创建了一个相应的常量,然后给对应的引用初始化。在c++中 右值的生命周期仅存在于当前语句中,所以从某种程度上看,不能很好的使用右值,其实是一种性能浪费,所以c++11新增了右值引用。...

2019-04-08 17:07:02 110

原创 c++11 - 参数包之模版可变参数

参数包c++11 的参数包就是我们老版本c++中的可变参数。它的声明也很像我们老版本的可变参数 template<class T, class ... Args> void Fun( T arg1, Args);参数包分为俩类模版类中的 模版参数的参数包,它可以是一个具体的类型、模版类型。(其实就是带可变参数的模版类) 具体类型我理解为 就是老版本中模版类如下的用法...

2019-04-08 00:15:15 2425

原创 c++ 临时对象

临时对象c++ 临时对象具有常量的属性,并且它的生命周期常常只存在于当前表达式中。临时对象生命周期struct A {~A () { cout << "A" << endl; }};A Fun() { return A();}int main () { A a; a = Fun(); //此时会产生一个临时对象,并且在 该行结束后,就会...

2019-03-28 18:49:22 540

原创 snprintf

snprintf最近使用snprintf 遇到了一个坑 , 下面是snprintf 的函数声明。int snprintf(char *str, size_t size, const char *format, ...);我使用的场景如下,当items 结构很多的时候,程序就崩溃了,开始查找了很久,最后发现是snprintf的使用问题。snprintf 我先入为主的认为它的返回值 像 rea...

2019-03-26 18:29:42 5494

原创 -rdynamic(–export-dynamic) 选项

export-dynamic最近写代码用到了 dlopen函数,dlopen 函数里面使用到了 主程序中的一些全局符号(全局变量 或者 函数)。这个时候生成主程序 指定 dlopen函数的连接的 .so 文件的时候,报链接错误。经过咨询大佬得知,生成主程序的时候加上 -export-dynamic 选项就解决了,从现象上可以看到 加了这个选项后 动态库文件就可以使用主程序的内容了。...

2019-03-11 16:22:38 5761

原创 c++ 模板总结

模板模板被称为c++ 下的编译器多态。最近写模板遇到了一些坑总结下。模板 声明与定义分离c++ 惯有的源文件模式都是 将声明写到 .h 文件中,将实现写到 .cpp 文件中。但是对于模板来说,如果我们把 模板类或者模板函数这样分离实现,当链接的时候会报链接错误。本质上,这个错误因为 当其他源文件 包含 模板的头文件的时候,编译器编译当前源文件时会认为该 模板 已经有了相应实现,具体的实现...

2019-03-05 18:51:17 206

原创 c++ 隐藏

c++ 同名隐藏c++ 的隐藏本质是因为作用域的原因。无论局部隐藏、基本与派生类之间的隐藏都是因为作用域的缘故。局部隐藏原则#demo1 void Func(){}int main(){ int Func; Func(); return 0;}error: called object 'Func' is not a function#demo2 int x;vo...

2019-03-04 18:33:57 2960

原创 编译器构造函数优化(NRV 优化)

NRV优化NRV优化指发生在 函数以值返回时的拷贝构造的优化。如下这个demo,函数以值函数会发生拷贝构造,但是某些场景这个拷贝构造可以被省去。class T {};T Fun();如下面这个场景发生了俩个构造,一个是默认构造函数构造出了ret,一个ret构造出了返回的临时对象。class T { public: T() {} T(const&amp; T)...

2019-02-11 00:54:53 602

原创 析构函数的显示调用

析构函数今天发现析构函数居然可以显示调用,但是构造函数却不行。想到C++中STL的对象释放就是通过显示调用析构函数来释放的资源。

2019-02-11 00:33:09 1032

原创 placement new

placement new它们其实是c++ 预先重载的operator new 函数,它的实现很简单如下void* operator new(size_t , void* p) { return p;}使用场景void* p = malloc(sizeof(T));T* object = new(p) T;虽然实现很简单,但是它有很大的魔力,它可以让我们在一个已分配好的内存上构...

2019-02-11 00:29:19 157

原创 设计模式之桥接模式(Bridge)

意图接口与实现的分离(将代码解耦,降低编译依赖)在运行时动态的绑定不同的实现提升代码扩展性,接口和实现可以独立的扩展可以多维度组合何为桥接考虑如下结构,有一个ThreadSchedule类。 它下面有时间片调度和抢占调度俩个子类,每一个调度类还有具体实现的平台子类。这种架构实现方式,如果增加一个调度类型,我们就需要增加3种类。也就是说平台和调度耦合到了一切极度不好扩展。那么我们...

2019-02-01 21:28:56 618

原创 c++11 并发编程

锁unique_lock构造/析构该类对象用于管理mutex对象。关键该类型对象析构的时候会对mutex进行解锁,可以防止如果发生异常导致未释放锁导致的死锁现象。unique_lock 有一个所有权的概念,这个所有权是指如果unique_lock 管理的mutex对象被它所上锁那么就代表该mutex所有权是属于它的。default (1) unique_lock() noexcept; ...

2019-01-23 10:56:10 187 1

原创 git常用操作

git 本地仓库git 本地由三部分组成如上图,工作目录 -&gt; 暂存区 -&gt; 版本树(保存每次版本提交的记录)。接下来的所有操作都是基于这三个基本组成之上。提交代码git add &lt;filename&gt; 该操作将工作目录的文件移动到暂存区。此时使用git status 显示我们刚刚 git add 的文件由操作之前的红色 变为 绿色。git commit -m...

2019-01-22 15:25:56 149

原创 nothrow new

new 异常当我们设置set new_handler函数的时候,new 失败就会转调用 我们设置的 handler函数,但是如果没有设置就会抛出 bad_alloc异常。这个时候如果没有catch 这异常程序就会退出,所以正确的new 的使用方式如下template &lt;class T&gt;T* Alloc(){ try { T* tmp = new T(); ...

2019-01-17 16:53:36 586

空空如也

空空如也

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

TA关注的人

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