自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 代码规范

我的代码规范:头文件一个.cpp文件一般包含一个.h文件 ,但是一些测试代码偶尔也只有.cpp文件。 所有的头文件都有#define 做条件编译防止重复包含。不包含不必要的头文件,尽量减少前置声明。都文件包含顺序:C语言系统调用C语言库函数C++库函数C++第三方库自己项目的.h文件作用域在变量定义时初始化不同的大功能模块使用namespace制定作用域尽量...

2019-12-03 21:47:21 178

原创 互斥锁与自旋锁

下面摘录一些关于C++当中 自旋锁(spin lock)与互斥量(mutex)的比较 自旋锁是一种非阻塞锁,也就是说,如果某线程需要获取自旋锁,但该锁已经被其他线程占用时,该线程不会被挂起,而是在不断的消耗CPU的时间,不停的试图获取自旋锁。 互斥量是阻塞锁,当某线程无法获取互斥量时,该线程会被直接挂起,该线程不再消耗CPU时间,当其他线程释放互斥量后,操作系统会激活那个被挂起的线程,让其投入

2018-04-11 20:11:32 258

转载 Reactor 与 Proactor模式

一、Reactor模式(反应器模式) 1、Reactor模式的特点 Reactor用于同步I/O,同步是指用户进程触发IO操作并等待或去轮询的查看I/O操作是否就绪,如果事件就绪的话需要应用程序自己读取或写入数据。(Reactor模式需要用户自己进行I/O操作)。 并发系统常用Reactor模式代替常用的多线程的处理方式,节省系统的资源,提高系统吞吐量。 2、使用同步I/O模型(以epo

2018-04-08 22:04:46 283

原创 线程池基础

为什么要有线程池没有线程池会出现的问题。 大多数的网络服务器,包括Web服务器都具有一个特点,就是单位时间内必须处理数目巨大的连接请求,但是处理时间却是比较短的。在传统的多线程服务器模型中是这样实现的:一旦有个请求到达,就创建一个新的线程,由该线程执行任务,任务执行完毕之后,线程就退出。这就是"即时创建,即时销毁"的策略。尽管与创建进程相比,创建线程的时间已经大大的缩短,但是如果提交给线程的任务是

2018-04-08 19:38:47 351

原创 IO多路复用之---select----poll----epoll

五种IO模型1、阻塞式IO: recv recvfrom read 读文件描述符当文件描述符里面没有数据则阻塞式等待。等待的时候这个等待的线程/进程被挂起。2、非阻塞式IO: 轮询式。 recvfrom read recv 函数通过设置参数 不停的查看内核数据是否准备好。 调用recvfrom 如果没有数据 返回特定错误码 EWOULDBLOOK 在应用程序中循环

2018-04-07 03:04:44 242

原创 面向对象的感念和基本原则

三大特性是:封装,继承,多态 所谓封装,也就是把客观事物封装成抽象的类,并且类可以把自己的数据和方法只让可信的类或者对象操作,对不可信的进行信息隐藏。封装是面向对象的特征之一,是对象和类概念的主要特性。 简单的说,一个类就是一个封装了数据以及操作这些数据的代码的逻辑实体。在一个对象内部,某些代码或某些数据可以是私有的,不能被外界访问。通过这种方式,对象对内部数据提供了不同级别的保护,以防止程序中...

2018-04-02 11:50:35 228

原创 设计模式之工厂模式

工厂模式大致可以分为三类: 1、简单工厂模式 2、工厂方法模式 3、抽象工厂模式。 这三种模式逐步抽象,并且更具有一般性。 工厂模式有一种非常形象的描述,建立对象的类就像一个工厂,而需要被建立的对象就是一个个产品,在工厂中加工产品,使用产品的人不用关心产品是如何生产出来的。在软件中使用工厂模式的好处就是降低了模块之间的耦合。设计模式的实现是基于C++多态来实现的。...

2018-03-29 23:10:14 201

原创 关于C++对象模型的经典问题

关于C++ 的继承 多态 和与之相关的对象模型知识,各个书本上很多了 今天来看几个对象模型的问题 在实践中理解C++ 对象模型:1、 在下列代码中:class A{public : A() :_a(1) {} virtual void FunTestA() {} int _a;};class B{...

2018-03-17 14:27:56 453

原创 Linux 线程的同步与互斥

多个线程并发共同操作临界资源会出问题各个线程代码的访问公共变量的代码段中,加减 不是原子操作, 判断前后等等任意地方,一个线程的代码会被CPU切出,另一个线程重新来执行代码。这会发生逻辑错误。为此我们必须提供同步与互斥机制。互斥机制1、同一时刻只能有一一个线程的代码在临界区内执行。 2、多个线程竞争进入没有代码证在执行的临界区时,只有一个线程可以进入。 3、没有在临界区内代码不...

2018-03-15 14:50:30 202

原创 Linux 线程基础

什么是线程 什么是进程线程是计算机中运算调度的最小单位, 他在进程的地址空间内运行。 是进程实际运作单位 一条线程是进程中单一顺序的执行流 。线程使操作系统调度执行的基本单位。而进程是操作系统中资源分配的基本单位,进程有自己独立的地址空间(页表),文件描述符管理的文件,IO设备,操作系统通过这些一定程度防止进程间资源的冲突。???为什么vfork 保证子进程先执行 因为...

2018-03-09 12:21:03 288

原创 Linux 信号相关知识

什么是Linux中的信号信号实际上是软件中断, 信号的存在提供了一种处理异步事件的方法。 给进程发信号 实际上是给PDB的信号字段的 对应信号的二进制位置 1; 是让进程终止 。 信号可以让进程暂停。 信号是有有限种类的 有编号的。本质上为什么kill -9 (进程id)命令 杀了一个进程 9号信号对进程的默认处理方式 进程即使在没有收到对应信号之前,也有默认的对每一...

2018-03-07 23:16:00 413

原创 Linux IPC之信号量

理解信号量。System V 版本有消息队列 ,共享内存, 信号量 这几种进程间通信方式。其中信号量的作用是为了协调进程之间的同步与互斥。同步:多进程/线程 要进行共同完成一项工作必须依照一定的次序协同完成,否则无法完成或者效率低下。互斥 : 在同一时刻,只能有一个进程 访问临界资源。临界资源: 多个进程/线程 都可以看见和访问的资源(文件, 部分内存地址)临界区:访问...

2018-03-05 11:50:53 310

原创 Linux IPC 之消息队列

认识消息队列消息队列提供了从一个进程到另一个进程发送一个数据块(整发整收)的能力。每个数据块被认为有一个应用类型, 接收者进程接受的数据块可以有不同的类型。消息队列的每一个发送和接收的数据块是有最大字节限制的(MSGMAX), 整个消息队列的大小也是有字节限制的(MSGMNB), 系统中的消息队列数量也有最大限制(MSGMNI)。与消息队列相关的系统调用1. #include <sys/types.

2018-03-01 03:04:35 369

原创 Linux进程间通信之 共享内存

对共享内存的理解基于共享内存的进程间通信方式,本质上是将两个进程的页表把各自地址空间上的数据映射到同一块物理内存上。使得两块进程之间在自己的地址空间同时看到一份公共资源。基于共享内存的进程间通信一旦将两个进程地址空间映射到同一物理内存后,两进程的消息传递不涉及内核。也就是说信息传递不是通过调用内核系统调用来完成的。 因此这也是System V版本进程间通讯的几个方式中效率最高的方式。共享内存 将

2018-02-28 00:11:32 249

原创 剖析STL空间适配器

为什么要有空间配置器1、小块内存带来的内存碎片问题 单从分配的角度来看。由于频繁分配、释放小块内存容易在堆中造成外碎片(极端情况下就是堆中空闲的内存总量满足一个请求,但是这些空闲的块都不连续,导致任何一个单独的空闲的块都无法满足这个请求)。2、小块内存频繁申请释放带来的性能问题。   关于性能这个问题要是再深究起来还是比较复杂的,下面我来简单的说明一下。   开辟空间的时候,

2018-02-10 03:20:20 522

原创 STL容器 map 与 set 的用法

认识pair在介绍容器之前,我们先来介绍一下pair,pair是一种结构体模板类型,每个pair可以存储两个值,这两个值的类型可以是任何类型的。它定义在 #include< uitility >中。在set map中使用pair的原因是让他们可以底层封装公用同一棵红黑树。定义在 uitility文件中的pair 结构体模板部分代码。template<class _Ty1, class _Ty

2018-02-04 19:46:40 337

原创 排序之 归并排序

归并排序归并排序是一种基于分治法的一种排序方法。它将要排序的序列分成两个长度相等的子序列,为每一个子序列进行排序,然后再将子序列合并成一个有序的序列。比如对 10 4 6 3 8 2 5 7 这个数列排序代码:templateclass T>void _Merge(T* arr, T* tmp, int begin, int end){ int mid = ((

2018-02-03 01:51:46 256

原创 堆排序

堆排序堆排序是一种特殊的选择排序。 大的原则还是如果升序 选择待排序类中最大排序码的元素放在最后位置 再选次大的放在倒数第二位置上 。。。。。最后把最小的放在第一个位置上。堆排序是借助建堆和堆的向下调整算法进行选择的。堆排序是一种效率很高的排序方法,尤其是在大量数据排序方面。举例说明堆排序用法和逻辑:将数组 int arr[] = {10,13,19,12,15,16,14,17,11,18}

2018-02-02 21:33:34 307

原创 排序之-----插入排序于希尔排序

插入排序插入排序基本思想:每一步将一个元素的排序码按照大小,插入到前面已经排好序的元素之中的合适位置,直到最后一个元素也插入了他之前的有序序列。直接插入排序 将array[i] 插到已经有序的array[0] array[i] ….. array[i - 1]中 先保存array[i]一个个比较 找到了位置后 将其他数均向后移动一个位置。 最后插入保存好的元素。直接插入排序在对待

2018-02-02 18:18:16 269

原创 非比较排序之 计数排序与基数排序

非比较排序与插入、希尔、快速、归并、堆排序等等排序方式不同的是 以上这些排序算法都涉及到待排序列中元素值的比较。 然而也有不需要比较的排序算法。计数排序计数排序主要思想:   给定一组要排序的序列,找出这组序列中的最大值,然后开辟一个最大值加1大小的数组,将这个数组里面的元素全部置零,然后用这个数组下标统计出要排序的序列中各个元素出现的次数。等到统计完成的时候,排序就已经完成。

2018-02-02 01:40:46 233

原创 排序之快速排序

什么是快速排序快速排序是一种排序算法 它的思想是: 要对一组无序的的数值序列排序,首先找一个值作为KEY 值(中间值)。 将其余数值小于(大于)KEY值的值放在KEY值位置的左边  大于(小于)KEY值的值放在KEY值的右边。 然后把KEY值左右两边的无序序列按上述逻辑作为递归子问题处理 。  递归出口是递归子序列只有一个值或没有值的时候递归返回到上一层。上述思想的具体实现方法有三种

2018-02-01 22:58:46 458

原创 Linux 进程间通信之 管道

为什么进程间要通信数据传输 进程需要把数据传递给其他进程资源共享 多个进程之间有时需要共享一份资源通知事件 比如子进程要把自己的退出信息交给父进程进程控制 比如Debug进程需要控制待调试进程的所有陷入和异常 , 并且知道他现在的状态。因为每个进程本来是拥有自己的虚拟地址空间 用页表映射到每个进程自己的物理内存上的 每个进程自己视为独占系统资源 各个进程的地址

2017-12-22 20:28:25 345

原创 Linux 文件描述符与文件系统

列表内容文件描述符Linux下一切皆文件 文件描述符是为了高效的管理已经被打开的文件而设计的 文件描述符作为操作文件的句柄 在Linux 下一切I/O操作的系统调用都是通过文件描述符操作的。文件描述符是一个非负整数,Linux下进程要访问一个文件就必须拿到该文件的文件描述符。每一个进程控制块结构体(PCB)中中都有一个指向 file_struct结构体的指针。 file_struct结构体中

2017-12-21 17:57:30 467

原创 Linux 进程控制

进程创建在操作系统中 一旦开始运行一个可执行程序 该可执行程序在磁盘中的数据和代码被加载到进程中 且同时进程中出现了用于描述其性质的唯一与其对应的PCB 则该可执行程序的实例 它的进程 被创建出来了。进程地址空间了解进程地址空间是 学习进程控制的理论基础。 地址空间绝不是物理内存 它只是一个抽象概念。 关于地址空间的结构在我的另一篇博客中提到了: http://blog.csdn.

2017-12-14 18:26:55 293

原创 Linux 进程概论

1. 了解冯诺依曼体系结构自行了解 不做赘述。2. 什么是操作系统 如何了解它操作系统最主要的作用是对一台计算机软硬件资源的管理。操作系统主要进行四个方面的管理: 文件管理, 进程管理, 内存管理, 驱动管理(由内核进行) 操作系统还包括其他程序 比如库函数 、shell(命令行解释器)程序。操作系统的目的: 1.与硬件交互 管理系统的软硬件资源 2.为用户

2017-12-11 20:21:17 399

原创 二叉树的基本操作及编程题总结(C++)

**二叉树编程题万变不离其宗在于对递归的理解和使用要弄懂用好递归 重要的在于一下几条:1.搞清楚函数递归调用栈帧的变化 特别是二叉递归时的栈帧变化2.搞清楚各个函数参数 传值和传引用 的函数参数在递归调用时值的变化。 本文中不加注明 所说的二叉树都是普通二叉树1.定义并构建一颗二叉树对于一颗普通二叉树的节点 至少要定义出他的值域 和指向其左右子树的左右指针域。 并定义出节点的构造函数 该函

2017-12-05 23:11:47 2351

转载 GCC 常用命令参数(转)

gcc这条命令用来将源代码生成可执行程序,下面来看一下gcc的常用选项。 1、无选项编译链接 例:命令:gcc test.c //会默认生成a.out可执行程序 2、-E: 进行预处理和编译,生成汇编文件。 命令:gcc -E test.c //会生成test.i文件 3、-S: 进行预处理,编译,汇编等步骤,生成”.s”文件 例:命令:gcc -S test.c //会生成t

2017-12-01 15:21:56 769

原创 静态库与动态库

一、什么是静态库、动态库??? 静态库:这类库的名字一般是libxxx.a,xxx为库的名字。利用静态函数库编译成的文件比较大,因为整个函数库的所有数据都会被整合进目标代码中,他的优点就显而易见了,即编译后的执行程序不需要外部的函数库支持,因为所有使用的函数都已经被编译进去了。当然这也会成为他的缺点,因为如果静态函数库改变了,那么你的程序必须重新编译。 动态库:这类库的名字一般是libxxx

2017-11-29 21:35:43 362

原创 二叉搜索树的原理和实现

什么是二叉搜索树二叉搜索树是一种特殊的二叉树,它是被广泛运用的存储查找结构------完全平衡二叉树(AVLtree) 和红黑树的基础(RBtree)二叉搜索树的规则:二叉搜索树可以是一棵空树如果其节点的左子树不空 则其左子树上的所有节点的值小于根节点的值如果其节点的右子树不空 则其右子树上的所有节点的值小于根节点的值每个节点的左右子树都是二叉搜索树为什么要设计出这种规则的二叉搜索树呢?

2017-11-20 16:52:11 866

原创 浅谈C++string类

这里向大家介绍C++库函数中的一个文件 为了简化程序员的工作量并提高代码的安全性和健壮性 C++标准库找专门提供了文件用来提供对字符串进行多种操作的库函数接口, 这些接口配合C++中文件中的strlen strstr strcpy …….系列函数共同为字符串的处理服务。本文中模拟的string类没有加迭代器 为了简化抽象出文件中string类的功能、内部实现机制和设计思想 。拷贝构造函数

2017-10-27 21:35:57 286

原创 字符串编程题题目解析(From leetcode)——1

原题目的地址:https://leetcode.com/tag/string/1. Give a string s, count the number of non-empty (contiguous) substrings that have the same number of 0’s and 1’s, and all the 0’s and all the 1’s in these subs

2017-10-25 10:06:50 941

原创 C++实现五子棋小游戏

五子棋游戏是在C++学习前期用于练手的很不错的小项目,实现粗糙的五子棋小游戏不需要对C++语法了解的非常深入也不许需要对数据结构的熟悉和理解达到多么深的层次 所以是一个非常简单的小程序实现五子棋小程序需要合理的设计整个程序的架构 整个游戏的实现分成:选择游戏方式、 初始化棋盘 、 每次落子更新棋盘 、 对是否已决出输赢的判断 和 胜者是谁的判断这几个模块 。每个模块对应实现函

2017-10-22 22:13:56 2560

原创 C++ 内联函数

用内联函数取代宏 C++中支持内联函数为了消除原C语言中宏 和宏函数的缺点 保留其优点关于中的宏:在C语言中 宏可以提高代码的执行效率 并使代码易于更改编译器在预处理阶段将宏代码文本替换到宏的使用处宏函数省去了参数压栈、生成汇编语言的CALL调用、返回参数、执行return等过程,提高了速度。节省了函数调用的开销。但由于宏的文本替换特性,导致其容易出错宏的使用常见错误1.`#defin

2017-10-22 16:54:34 324

转载 类的六个默认成员函数(转)

类默认生成的六个成员函数一、构造函数 我们知道,类的数据成员是不能在声明类的时候初始化的,因为类并不是一个实体,而是一种抽象的数据类型,并不占据存储空间。为了解决这个问题,C++提供了构造函数来处理对象的初始化。1、构造函数的作用  构造函数是一种特殊的成员函数,与其他成员函数不同,构造函数是在对象被实例化的时候自动被调用的,而且只执行这一次,它不能被用户调

2017-10-22 16:11:22 359

原创 深浅拷贝 & 类型萃取

一、深浅拷贝问题             1)什么是浅拷贝所谓的浅拷贝是指在源对象向目标对象进行拷贝的时候 将源对象的各个成员逐一赋给新对象的成员这样做看似无可厚非,实际上如果源对象的数据成员中有指向一片内存空间的指针变量是 这种浅拷贝只是将这个指针变量作为右值付给目的对象的指针。这样做的结果是新对象的指针和源对象的指针指向同一片内存空间 。改动

2017-10-19 17:46:30 338

转载 C++中static关键字

C++中的static关键字的总结  C++的static有两种用法:面向过程程序设计中的static和面向对象程序设计中的static。前者应用于普通变量和函数,不涉及类;后者主要说明static在类中的作用。1.面向过程设计中的static1.1静态全局变量在全局变量前,加上关键字static,该变量就被定义成为一个静态全局变量。我们先举一个静态全局变量的例子,如下:

2017-10-18 16:35:18 226

原创 简述单例模式

一、单利模式的定义在特定的时候我们会遇到一种情况:一个类只能有一个对象被实例化,这个时候我们就可以使用单例模式。单利模式通过类本身来管理其唯一实例。在设计这个类的时候,让它只能产生一个实例并提供对此实例的全局访问。所以单例模式的两个要素分别是:1.确保一个类只有一个实例被创建。2.提供一个对实例的全局访问指针。

2017-10-18 16:31:38 1133

原创 剑指offer--知识迁移问题

所谓知识迁移能力就是根据已经掌握的知识、技术、能够迅速学习理解新的技术并运用到实际工作中去。这是作为一名软件开发工程师必备的能力这里简单介绍几组本科生招聘面试中易考到的考察知识迁移能力的问题   统计一个数字在排序数组中出现的次数。例{1,2,3,3,3,3,3,4,5,5,5,6} 输出 重复的数字3出现的次数思路:本题若使用二分查找找到重复的

2017-10-10 23:05:42 356

原创 浅谈C++ string类

这里向大家介绍C++库函数中的一个文件 。为了简化程序员的工作量并提高代码的安全性和健壮性 C++标准库找专门提供了文件用来提供对字符串进行多种操作的库函数接口,这些接口配合C++中文件中的strlen strstr strcpy .......系列函数共同为字符串的处理服务。本文中模拟的string类没有加迭代器   为了简化抽象出文件中string类的功能、内部实现机制和设

2017-10-06 00:40:51 304

原创 堆--优先级队列--topK问题

堆是一个用途很广泛的数据结构,是实现topK问题、堆排序以及优先级队列等问题的必备工具。深刻理解堆这种数据结构,掌握实现堆的技能是学习数据结构非常重要和必备的一环。        堆的本质是:                    vector + 向上调整 和 向下调整         人们在想象中把它抽象为一棵每个父亲节点都比它两个子节点 大/小 的二叉树  

2017-09-21 19:59:22 541

空空如也

空空如也

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

TA关注的人

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