自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

haishark的博客

储存知识

  • 博客(57)
  • 问答 (1)
  • 收藏
  • 关注

原创 MYSQL锁机制

MYSQL锁机制死锁什么情况下会产生死锁死锁演示死锁处理方式MVCC-乐观锁什么是MVCC悲观锁间隙锁行锁升级为表锁死锁什么情况下会产生死锁死锁是指两个或者两个以上进程在执行过程中因争夺资源而造成一种互相等待的现象,若无外力作用,他们都无法再推进下去,此时称系统图处于思索状态或者系统产生了死锁,这些永远互相等待的进程称为死锁进程,表级锁不会产生死锁,所以MYSQL的死锁主要针对的还是innoDB。类型死锁情况表级锁否页级锁可能会行级锁会死锁演示通常

2020-06-29 22:27:36 153

原创 mysql事务与锁基础

MYSQL事务与锁基础事务基础理论事务必要性引入事务的目的事务四大特性(ACID)事务基本语法事务简单操作锁基础锁的概念锁类型innoDB锁innoDB锁类型SQL语句加锁事务生命周期事务 重做日志和回滚日志重做日志持久化回滚日志事务基础理论事务即 transaction,是数据库系统区别于文件系统的重要特性之一。在文件系统中,如果我们正在写文件,但是操作系统突然崩溃了或者断电了等突发事件,那么写的文件数据有可能会丢失,但是数据库系统通过事务来保证这一点。事务必要性1. 假设有两个用户,不

2020-06-27 14:33:01 183

转载 MFC 双缓冲技术和兼容DC

转载地址:http://blog.csdn.net/gameloft9/article/details/23760677一、绘图时屏幕闪烁的原因分析:       屏幕闪烁的根本原因是相邻两帧图像之间存在的巨大差异造成的,而windows的图形刷新方式使得任何两帧图像之间都存在着巨大的差异。因为windows在进行刷新之前都会首先将整个屏幕刷成白色,就相当于在电影胶片的相邻两帧之间都插入了...

2018-09-28 16:09:31 487

原创 MFC消息

 Windows消息目录1. WM_NULL=$0000:2. WM_CREATE=$0001:    应用程序创建一个窗口3. WM_DESTROY=$0002:    一个窗口被销毁4. WM_MOVE=$0003: 移动一个窗口5. WM_SIZE=$0005:改变一个窗口的大小6. WM_ACTIVATE=$0006: 一个窗口被激活或失去激活状态;7. WM_SETFOCU...

2018-09-17 16:47:08 252

转载 epoll模型

在linux的网络编程中,很长的时间都在使用select来做事件触发。在linux新的内核中,有了一种替换它的机制,就是epoll。相比于select,epoll最大的好处在于它不会随着监听fd数目的增长而降低效率。因为在内核中的select实现中,它是采用轮询来处理的,轮询的fd数目越多,自然耗时越多。并且,在linux/posix_types.h头文件有这样的声明:#define __

2017-09-09 20:00:29 238

原创 Linux--shell中字符串的截取

1.在linux中字符串的截取我们可以用一个命令叫做cut,cut主要截取方法有三种1)字节(bytes),用选项-b ,使用方法cut -b/c/f 2)字符(characters),用选项-c 3)域(fields),用选项-f2.以字节定位1)当我们想获取某一字节时 -b后面可以设定要提取哪一个字节,其实-b和3之间没有空格也是可以的,但推荐有空格

2017-08-02 23:16:45 8859

原创 线程安全和可重入函数

线程安全与可重入定义  线程安全:如果你的代码所在的进程中有多个线程在同时运行,而这些线程可能会同时运行这段代码。如果每次运行结果和单线程运行的结果是一样的,而且其他的变量的值也和预期的是一样的,就是线程安全。  可重入:可重入代码也叫纯代码(Pure code)是一种允许多个进程同时访问的代码。为了使各进程所执行的代码完全相同,故不允许任何进程对其进行修改。程序在运行过程

2017-07-27 15:30:56 293

原创 C++多态理解及多态对象模型探索

什么是多态? 多态(Polymorphism)按字面的意思就是”多种状态”。简单的说,就是一句话:允许将子类类型的指针赋值给父类类型的指针。在C++中过虚函数(Virtual Function) 实现的,使用的关键字是virtual。多态分类 1.静态多态,在编译期间完成。编译器会根据函数的参数来确定调用哪一个参数,如果有这个函数则调用它,否则直接报错。 2.动态多态,在执行期

2017-07-27 14:56:51 397

原创 Linux--守护进程,为什么要fork两次

守护进程 守护进程也称为精灵进程,Linux 下server都是守护进程。守护进程特点如下:  (1)其父进程是1号进程  (2)在后台运行,独立于终端,周期性的以某种任务或等待处理某些发生的事  (3)自成进程组,自成会话,不受登陆注销等影响  (4)一般是孤儿进程因为他们不受用户登录和注销的影响,一直运行着,因此给他们取了一个名字叫做

2017-07-25 23:02:29 1327

原创 Linux三次握手和四次挥手

tcp协议格式tcp三次握手过程1.client端向server端发送一个SYN(连接请求)的报文,其中包含了一个初始序列号和一个窗口大小(主要是为了告诉对方自己的接受能力是多大);2.服务器收到客户端发送的SYN报文后,也同样向对方发送一个SYN,ACK的报文,还有一个窗口大小(表示服务器上用来存储来自客户端数据多少的一个能力);3,客户端收到服务器端返回的SYN和ACK之后

2017-07-24 13:07:32 413

原创 C++继承的理解与四种默认构造函数探索

继承定义继承的目的: 是为了面向对象的复用,所谓复用就是父类是子类的一部分。继承的定义:c++中一个子类(派生类)可以由一个父类(基类)派生而来,这是单继承;一个子类由多个基类派生而来,这叫多继承;如果两个子类同时由一个基类派生而来,并且他们有一个子类,这是菱形继承(钻石继承)。如图所示:不同的继承格式单继承格式:class 派生类名:继承方式 基类名{};其中,class是关键

2017-07-23 13:27:07 2609 1

原创 c/c++部分知识总结

c/c++部分知识总结1、C语言中malloc、calloc、realloc的不同(1) malloc分配指定字节数的存储区。此存储区中的初始值不确定 (2) calloc为指定长度的对象,分配能容纳其指定个数的存储空间。该空间中的每一位(bit)都初始化为0 (3) realloc 更改以前分配区的长度(增加或减少)。当增加长度时,可能需将以前分配区的内容移到另一

2017-07-22 12:54:57 224

原创 Linux--ARP协议与CRC校验

arp协议地址解析协议(Address Resolution Protocol), 是根据IP地址获取目标主机的一个MAC地址的TCP/IP协议。通信前提两台主机要进行通信,那么首先要知道对方的MAC地址,但是怎么才能知道堆放的MAC呢?这里就要用到我们的ARP协议了。主机发送信息的时候将包含目标主机IP的ARP请求通过广播发送到网络上的所有的主机,等待接受到返回信息,收到返回信息后将IP和mac地

2017-07-18 10:09:24 755

原创 Linux--计算机端口分类与定时器的分类

计算机一共有多少端口理论上 0~65535 都可以用作端口号 其中1~1023是保留端口,是一些程序所固定使用的,比如网页用80 邮件POP用110,Telnet的端口号是23,FTP端口号21等,其余的几万个就是随机的了,一些进程在开始运行时会随机开启的,人工也可手到设定的 不过要避免使用知名的端口号以及预留的端口号。端口分类端口概念   在网络技术中,端口(Port)大致有两种意思:一是物理

2017-07-17 09:21:29 316

原创 NAT,代理服务器技术

#NAT技术NAT(Network Address Translation,网络地址转换)是1994年提出的。当在专用网内部的一些主机本来已经分配到了本地IP地址(即仅在本专用网内使用的专用地址),但现在又想和因特网上的主机通信(并不需要加密)时,可使用NAT方法。这种方法需要在专用网连接到因特网的路由器上安装NAT软件。装有NAT软件的路由器叫做NAT路由器,它至少有一个有效的外部全球IP地址。这

2017-07-15 09:32:11 741

原创 C++String深浅拷贝

C++的一个类里面有6个默认成员函数,意味着如果我们自己不定义这六个函数,那么编译器会使用系统的成员函数,但是一旦我们自己定义了这六个成员函数,那么编译器会调用我们定义的,而不是系统默认的,现在我们主要来分析以下String的深浅拷贝问题。深浅拷贝是C++中比较重要的。什么是浅拷贝所谓的浅拷贝,就是只拷贝指针指向的内容,而不改变它的地址空间,这就意味着改变其中一个的内容,另一个也跟着改变。 示例:

2017-07-06 23:19:02 459

原创 深入探索构造函数

构造函数的初始化问题大致分为以下几类:( 1 )全缺省参数初始化, 不用传参。 (2)半缺省参数初始化, 传部分参数 (3)无缺省参数初始化,定义多少个成员变量,传多少个。 (4)使用初始化列表初始化,此类初始化更加高效,建议初始化的顺序与声明的顺序相同。 首先定义一个日期类如下:class Date{public: //全缺省参数 Date(int yea

2017-07-05 17:17:38 197

原创 类与对象

1:整理类和对象的基础知识,如类的定义,访问限定符,面向对象封装性,对象的大小计算等等。 2:整理四个默认成员函数及运算符重载相关知识 3:整理隐含的this指针等等,及对运算符重载背后做的事情。在未接触C++之前,知道c与c++的区别就是c++是面向对象的一门语言,但是 对于什么是对象和类根本不了解,当我开始学c++的时候才认真去做了了解,了解什么是类,对象?类是面向

2017-07-02 22:34:20 222

原创 gdb调试多进程多线程

gdb调试指令介绍gdb run(r) 程序运行 gdb q (quit)退出调试运行gdb break(b)文件名+n 在某个文件1的第n行打断点 gdb delete breakpoints 取消所有断点 gdb delete breakpoints n 取消n个断点gdb cont/continue 使程序跳过暂停在当前断点继续运行 gdb cont n跳过n个断点继续

2017-06-24 18:19:12 353

原创 C++基础入门介绍

一、命名空间的介绍(1)什么是命名空间命名空间是ANSIC++引入的可以由用户命名的作用域,用来处理程序之间的同名的冲突。实际上就是一个由程序员命名的一块内存区域,程序设计者可以根据需要指定一些有名字的空间域,把一些全局实体分别放在各个命名空间中,从而与其他全局实体分隔开来。namespace AA{ int a; double b;}namespace是定义命名空间所必须写的关

2017-06-19 16:21:15 316

原创 生产者消费者模型

一.理解生产者与消费者linux中有了生产者消费者这一概念,那么是不是可以和现实生活中的生产者消费者相联系起来去看待它?回答是肯定的,在我们生活中我们时时刻刻充当了消费者的角色,生产者生产商品,那么两者之间要进行交易那么就有了一个公共的交易场所,比如学校超市。可以用这样一个图来解释这种关系。 从中我们可以总结出一个 3 2 1 原则 如果我们去买东西,超市里面没有货物,我们会不会隔一秒就

2017-06-17 17:14:12 458

原创 单链表面试题--复杂链表的复制

关于单链表中复杂单链表的复制问题是比较复杂的了,当我看到这个题,我对于题目就理解了半天,更别说如何下手去分析题目了。 复杂链表结构下 有一个只想下一个数据的指针_next 有一个指针_random指向任意节点(我就对于这句话不怎么理解,指向任意节点,那么怎么创建它的链表啊,蒙了,后来想明白只需要自己指定它的_random, 如果一个测试用例可以跑通了,那么对于其他的任意_random是不是也可

2017-06-16 18:32:58 467

原创 单链表面试题(综合)

1.判断单链表是否带环?若带环,求环的长度?求环的入口点?分析: (1) 如果一个链表不带环,那么他的结尾就是NULL。 (2) 如果一个链表带环,设置一个快慢指针,快指针每次走两步,慢指针每次走一步,考虑一下,如果带环他们是不是会在环里面相遇?既然如此。可以设置一个走一步,一个走三步么?很明显是不行的。为什么不行?可以画一个图来证明它。如果快慢指针位于如图所示位置,就不可能会相交了。而选择

2017-06-15 15:08:07 178

原创 有关链表的一些常见面试题

在我们面试的时候链表是考官们比较喜欢考的问题之一,链表总的来说比较简单,但是却比较容易出错,我刚开始接触链表的时候,一不小心就出现了各种各样的问题,因此在这里总结了一些链表有关的面试题。题一:删除一个无头单链表的非尾节点这里无头单链表并不是真正的无头,只是不告诉我们而已,在做这个题的时候,根据我们的思路,如果要删除一个节点的简单方法就是,把这个节点的前一个节点的next指向后一个节点,然

2017-06-11 15:14:38 326

原创 进程间通信--消息队列

Linux的一个重要特色就是允许两个进程间通过数据交换进行通信,这样简单的程序就可以组合起来实现复杂的任务。现在我们主要谈谈基于系统V IPC机制的通信方式–消息队列。一.什么是消息队列?消息队列是消息的链表,每个消息都有固定的最大长度。消息可以加到队列的尾部,消息的发送次序和接收次序是一致的,消息是可以有类型的,这样使用一个队列就可以处理多个消息流。在使用消息队列之前,和IPC另外两

2017-06-07 14:52:23 359

原创 进程间通信:共享内存

系统V的IPC通信机制包括了消息队列、共享内存和信号量。每一种IPC结构结构都有一个非负整数标志,当创建一个IPC结构时,调用进程都必须提供一个类型为key_t的键(key)。操作系统把这个键转换为一个IPC的唯一标识符。可以使用以下方式来指定一个键,调用函数如下:#include #include key_t ftok(const char* path, int projecti

2017-06-06 16:08:36 257

原创 线程:死锁

一.死锁原理死锁可以定义为一组相互竞争系统资源或进行通信的进程间的“永久”阻塞。当一组进程中每个线程都在等待某个事件(典型的就是等待所请求的资源被释放),而只有这组进程的其他被阻塞的进程才可以触发该事件的发生,这是这时就称为这组进程发生死锁。因为没有事件能够被触发,所以死锁是永久性的。 我们生活中常见的死锁问题就是交通死锁。如图所示,显示了一个十字路口4辆车几乎同时到达了,并且相互交叉的停了下来,

2017-06-05 20:23:37 966 1

原创 线程的简单解析

一、线程基本概念 线程是程序中一个单一的顺序控制流程。在单个程序中同时运行多个线程完成不同的工作,称为多线程。 线程和进程的区别在于, 子进程和父进程有不同的代码和数据空间, 而多个线程则共享数据空间,每个线程有自己的执行堆栈和程序计数器为其执行上下文。多线程主要是为了节约CPU时间,发挥利用,根据具体情况而定.线程的周期新建就绪运行阻塞死亡线程调度与优先级有线程进入了就绪状态,

2017-06-04 23:10:10 240

原创 进程间通信--信号量

进程间通信除了匿名管道,命名管道;还有XSI IPC(消息队列、信号量和共享内存)。 一. 函数介绍 1.什么是信号量? 为了防止出现因多个程序同时访问一个共享资源而引发的一系列问题,我们需要一种方法,它可以通过生成并使用令牌来授权,在任一时刻只能有一个执行线程访问代码的临界区域。临界区

2017-06-03 20:04:36 427

原创 进程间通信--FIFO

在linux进程间通信中,管道(pipe)是非常有用的,而且我们使用的地方也非常多,但是不可否认的是管道有一个致命的缺点就是只能用于有相关关系的进程之间的通信,比如:父子进程。为了很好的解决这个问题。因此我们引入了——FIFO(first in first out)顾名思义:先入先出。相对于pipe来说,FIFO一般被称为命名管道,因为他们和文件系统相关联,可以实现任意两个进程之间的通信。

2017-05-24 20:13:57 961

原创 c语言实现简单通讯录

我们都知道通讯录有的一些基本简单的功能就是: 1.增加联系人 2.删除联系人 3.查找联系人 4.改动联系人 5.显示联系人 6. 清空联系人 7.给联系人排序 0. 退出 具有了这些基本的功能之后就是一个简单的通讯录了。说起来是不是很简单,当我初始准备确实现它的时候,我觉得真的好难好难。 其实简单的方法就是开始就给它一块固定大小的空间,比如100

2017-05-17 15:12:14 1191 1

原创 函数指针和函数指针数组

不得不说,我看到这个题目,我就被他给绕晕了。更别提使用它了,尽管它难,难于理解,难于使用,容易搞混,所以我们更有理由去弄明白它,因为只有学习有难度的东西,才会有进步,如果出现的都是会的,那么我们也不会在这学习了吧。 通过最近的一些学习,我希望能够把它弄清楚,也希望能够帮助其他那些像我这个菜鸟一样,对这部分不清楚的娃。接下来我就通过自己的学习和理解,介绍一下函数指针和函数指针数组。 一.函数指针与

2017-05-11 16:40:12 481

原创 指针数组与数组指针比较

指针是C语言里面很重要的一个东西,C语言因为有了指针才变得绚丽多彩。有句话是这样说的“如果你掌握了指针与内存,那么C语言也就学会了。”,由此可见,指针的重要性。这里我简要谈谈指针数组与数组指针的区别。从他们的名字我们可以得出这样的结论:指针数组:这是一个数组;数组指针:是一个指针。然后我们看看他的用法:(我们在分析是数组还是指针的时候可以采用把他名字和类型分开来分析,去

2017-05-09 18:38:13 363

原创 孤儿进程与僵尸进程

一.僵尸进程与孤儿进程定义僵尸进程:一个子进程在其父进程还没有调用wait()或waitpid()的情况下退出。这个子进程就是僵尸进程。僵尸进程会以终止状态保持在进程表中,并且一直等待父进程都去退出状态代码。孤儿进程:一个父进程退出,而它的一个或多个子进程还在运行,那么那些子进程将成为孤儿进程。孤儿进程将被init进程(也是1号进程进程)所收养,并由init进程对它们完成状态收集工作。

2017-04-27 16:52:30 502

原创 atexit函数介绍

根据我们的理解,一个程序的执行都是从MAIN函数开始执行,从MAIN函数结束,这不可否认没有问题,然后依次往下一条一条语句执行,但是事实真的是这样么,接下来看看这个程序,是不是像我们想象的那样呢?在linux下我编写了这样一个程序,先不要看答案,看看能不能做对(很简单的)根据我们刚才的思路,这个程序应该是先调用fun1,fun2,...依次往下执行,最后的结果就是i am NO.1!

2017-04-25 17:58:48 722

原创 可变参数的使用-printf简单实现

我们在写一个程序的时候,经常用到一些函数,例如printf函数,在我们用的时候觉得并没有什么觉得他很简单啊,我们使用的时候都没有注意过,它其实有很多种调用方法。例如:其实这就是可变参数,我们看看printf函数的原型,是这样的 我们可以看到printf函数除了有一个固定的format参数以外,其他都是可变的,因此才有了不同的调用方法       

2017-04-23 11:20:45 4061 6

原创 浅谈——程序执行和函数的调用

以前写一个程序,只知道编译,在无错后就直接运行了,然后看看结果是不是自己想要的,结果对了然后就啥也不管了,如果错了就只会一行一行的看自己的代码,看看问题在哪(大多数时候,看了半天也不知道问题在哪),经过最近的学习了解,才知道一个程序的运行也不是我所想的那么简单。初步了解了一个程序的运行包括了,预处理,编译,汇编,链接等过程,这些过程下面又分了很多的子过程,要想真正的去了解他,要学习的还有很多。

2017-04-19 20:14:21 1484

原创 struct tast_struct 和mm_struct成员中的冰山一角

这个东西范围太广了,发现的只是其中微小的的一个角落tast_structstruct task_struct { volatile long state; /* -1 unrunnable, 0 runnable, >0 stopped */ void *stack; atomic_t usage; unsigned int flags;

2017-04-12 14:41:36 684

原创 扫雷(通俗易懂简易版)

我们绝大部分人都玩过扫雷,玩起来真的很简单,只需要1用鼠标点一点就可以了(要赢还是需要费脑经的)但是现在自己来编写一个简易版的扫雷,发现不是那么简单的,经过了几天的编写,终于实现了属于我的简易版的扫雷,过程简单,对于我这菜鸟来说,难的部分就是怎么去实现点一次一大片就空了(这里用了递归)。接下来就是我的扫雷程序和截图先看看电脑的扫雷界面,和我的扫雷界面(发现自己的好丑)玩过扫

2017-04-11 15:38:20 2584 1

原创 进度条的简单实现

代码如下#include #include int main(){ char buffer[52] = {'\0'}; char ch[] = {'|', '/', '-', '\\'}; printf("\033[?25l\033[41m"); printf("%69s\r"); fflush(stdout); printf("\

2017-04-06 16:22:56 498

空空如也

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

TA关注的人

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