自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

NeverWA的博客

三天不写代码,上房揭瓦

  • 博客(98)
  • 收藏
  • 关注

原创 经典进程同步与互斥问题

经典进程同步与互斥问题1. 生产者-消费者问题1.1 简单的“生产者-消费者”问题设进程A、B是两个相互合作的进程,它们共享一个缓冲区,进程A向其中写入数据,进程B从中读出数据。producer:生产者进程,consumer:消费者进程。当缓冲区不空时,消费者便可以读数据;当缓冲区为空时,生产者便可以写数据。 设置信号量: full:表示有数据缓冲区的数目,初值为0; ...

2018-06-18 08:13:41 34915 1

原创 Java容器总结

ListArrayList底层为动态数组,因为它的增加、删除元素与size的变化不是原子操作,所以不是线程安全的LinkedList底层为双向链表,实现了List接口和Deque接口。不是线程安全的Vector创建了一个向量类的对象后,可以往其中随意插入不同类的对象。线程安全的,synchronized。替代方案:Collections.synchronizedList()MapH...

2019-12-20 11:29:32 194

原创 shell工具

shell 工具sortuniqpastecutxargsgrepsed基本命令高级命令特殊符号选项awkBEGIN 和 ENDawk脚本find常见选项其它重要工具freedfiostatnetstattoparprouteshell 工具sortsort将文件的每一行作为一个单位,相互比较,比较...

2018-09-01 17:21:44 511

原创 C++运算符重载的三个为什么

C++运算符重载的三个为什么1. 为什么有四个操作符不宜重载为友元函数?2. 为什么流操作符必须重载为友元函数?3. 为什么有五个操作符不能重载?C++运算符重载的三个为什么1. 为什么有四个操作符不宜重载为友元函数? 四个不能宜载为友元函数的运算符为:=、()、[]、->我在网上搜了许多博客,很多人都说是: 当把赋值运算符重载为类的友员...

2018-08-16 11:04:25 1054

原创 C++之lambda

C++之lambda什么是lambda表达式?lambda表达式语法捕捉列表?参数列表?lambda表达式的作用C++之lambda什么是lambda表达式?一个lambda表达式表示一个可调用的代码单元。我们可以将其理解为一个匿名的内联函数。lambda表达式跟普通函数相比不需要定义函数名,取而代之的多了一对方括号[]。lambda表达式...

2018-08-12 18:58:55 1055

原创 C++之智能指针

C++之智能指针auto_ptrunique_ptrshared_ptrweek_ptrC++之智能指针智能指针的核心思想:资源分配即初始化:定义一个类来封装资源的分配和释放,在构造函数完成资源的分配和初始化,在析构函数完成资源的清理,可以保证资源的正确初始化和释放C++标准库里主要有四种指针:auto_ptr、unique_ptr(scope_ptr)、s...

2018-07-16 18:00:17 1555

原创 C++之类型萃取

C++之类型萃取在C++中想要获得某个变量的类型有两种方式: 一种是利用typeid。 ypeid是C++的关键字之一,等同于sizeof这类的操作符。typeid操作符的返回结果是名为type_info的标准库类型的对象的引用。 用法:typeid().name()#include <iostream>using namespace std;class Bas...

2018-07-13 16:41:07 3221

原创 C++之类模板特化

C++之类模板特化模板:template<typename T1, typename T2>class example{public: example(); ~example();private: T1 data1; T2 data2; int data3;};template<typename T1, typena...

2018-07-13 15:47:11 5692

原创 C++关键字之virtual

C++关键字之virtual1. 虚基类在C++之继承的多重继承引起的二义性问题中讲到,解决二义性问题的另一个方法就是用关键字virtual。具体做法就是虚基类。1.1 声明虚基类虚基类的声明并不是在声明基类时声明的,而是在声明派生类时,指定继承方式时声明的。声明时只需在派生类指定继承方式前面加上关键字virtual即可。class A{int a};clas...

2018-07-01 14:55:01 9590

原创 C++之继承

C++之继承1 公有继承2 私有继承3 保护继承4 派生类的构造函数与析构函数4.1 派生类的构造函数4.2 派生类构造函数的特殊形式4.3 派生类的析构函数5 多重继承5.1 多重继承的二义性问题C++之继承一个新类从已有类那里获得其已有特性,这种现象称为继承。新类叫做派生类或子类,原来的已有类叫做基类或父类。值得注意的是派生类和基类永远是相...

2018-06-27 10:08:14 9968

原创 C++之访问属性

C++之访问属性public属性为public的成员,不仅该可以在该成员所属类的内部进行访问,而且可以在类外通过类的对象来访问。private属性为private的成员,只能在该成员所属类的内部进行访问,而不能在类外通过类的对象来访问。换句话说,对外不可见。protected属性为protected的成员,只能在该类所属的类的内部和其类的派生类中进行访问。...

2018-06-26 16:31:14 11673

原创 Linux 进程间关系和守护进程

Linux 进程间关系和守护进程进程间关系1. 进程组2. 作业2.1 作业与进程组的区别2.2 作业与Shell的联系3. 会话4. 作业控制守护进程1. 什么是守护进程?2. 创建守护进程的两种方法2.1 setsid函数2.2 daemon函数Linux 进程间关系和守护进程进程间关系1. 进程组进程组是一个或多个...

2018-06-24 17:50:39 11005

原创 Linux多线程

Linux多线程1. 线程?线程是一个进程内部的控制序列。线程共享进程数据,但线程也拥有自己私有的上下文数据、私有栈结构。是程序执行的最小单位。2. Linux中的线程Linux中的线程是用进程模拟的。在Linux中,操作系统没有专门的结构来管理线程,而是用给线程分配一个PCB(更准确地说应该叫TCB)。我们知道,Linux在创建进程时做了有如下工作: 1. 分配一个进程...

2018-06-22 11:11:04 11791

原创 gdb调试多流程程序

gdb调试多流程程序多进程默认设置下,在调试多进程程序时GDB只会调试主进程。但是GDB(>V7.0)支持多进程的分别以及同时调试,换句话说,GDB可以同时调试多个程序。只需要设置follow-fork-mode(默认值:parent)和detach-on-fork(默认值:on)即可。设置方法:set follow-fork-mode [parent|child] ...

2018-06-20 16:22:23 12521

原创 Linux 进程信号

Linux 进程信号信号的概念程序在正常执行过程中出现的异常情况, Linux可以响应这些异常的情况,当这些异常情况发生时,我们的程序就要做出相应的动作产生信号的来源用户按键 非法的内存访问 硬件故障 浮点数溢出 软件条件产生处理信号的方式缺省处理 忽略(SIGKILL SIGSTOP 不能忽略) 捕捉信号(SLGKILL SIGSTOP 不能被...

2018-06-20 15:06:46 13028

原创 C++之内存管理

C++之内存管理C中的内存管理malloccallocrealloc上述三种方式是用户在堆上开辟空间的办法,用完后必须用free释放,否则会造成内存泄露。 值得一提的是实际开辟的内存比申请的空间大:前面多申请32个字节,后面多申请4个字节。具体原因这里就不再阐述,详情见C语言动态分配内存C++中的内存管理C语言内存管理方式在C++中可以继续使用,同时C...

2018-06-19 10:37:20 12806

原创 C语言动态分配内存

C语言动态分配内存malloc动态开辟内存的函数:void* malloc (size_t size);这个函数向内存申请⼀块连续可⽤的空间,并返回指向这块空间的指针 如果开辟成功,则返回⼀个指向开辟好空间的指针 如果开辟失败,则返回⼀个NULL指针,因此malloc的返回值⼀定要做检查 返回值的类型是 void* ,所以malloc函数并不知道开辟空间的类型,具体在...

2018-06-18 15:45:24 13252

转载 C++获得程序运行时间

C++获得程序运行时间目前,存在着各种计时函数,一般的处理都是先调用计时函数,记下当前时间tstart,然后处理一段程序,再调用计时函数,记下处理后的时间tend,再tend和tstart做差,就可以得到程序的执行时间,但是各种计时函数的精度不一样.下面对各种计时函数,做些简单记录.方法1,time()获取当前的系统时间,返回的结果是一个time_t类型,其实就是一个大整数,其值表示从CU...

2018-06-17 20:52:11 16679 2

原创 C++之函数重载

C++之函数重载重载的引入使得C++的灵活性有了极大提升,重载体现在只要在定义函数时形参列表(形参个数、类型、顺序你)不同,就可以重复定义同名函数。值得注意的是,函数的重载这里并对函数的返回值做出要求,那么也就意味着c++中函数的重载不关心返回值,即若定义了两个函数名、形参列表相同,返回值不同,那么编译器也会认为这两个函数其实是一个函数,在编译期间就会报错。事实上,C++编译器在编译时还是...

2018-06-17 19:31:30 12806

转载 C++之右值引用

C++之右值引用c++11中的新概念,主要解决了移动语义和完美转发我们平常使用的引用都是指左值引用。 下面是一个测试例子void func ( int& i ) { std::cout << "func(int& i) = " &

2018-06-17 18:02:15 12928

原创 信号量集控制控制进程读写共享内存

信号量集控制控制进程读写共享内存#include<stdio.h>#include<sys/sem.h>#include<sys/types.h> ...

2018-06-17 15:53:46 12936

原创 centos7编译安装git

centos7编译安装git安装依赖 yum install curl-devel expat-devel gettext-devel openssl-devel zlib-devel yum install gcc perl-ExtUtils-MakeMaker下载源码 wget https://www.kernel.org/pub/software/scm/git/git-2.1...

2018-06-16 16:36:30 12914

原创 进程调度算法

进程调度算法在《计算机操作系统》一书中,提到了几种分时系统中的进程调度算法。现在将它们做一下整理1. 轮转调度算法该算法采取了公平的处理机分配方式,即让就绪队列的每个进程每次仅运行一个时间片。如果就绪队列上有n个进程,则每个进程每次大约都可以获得1/n的处理机时间。在该算法中,根据先来先服务(FCFS)策略,将所有的就绪进程排成一个就绪队列,并可设置每隔一定时间间隔产生一次中断...

2018-06-16 15:32:25 13069

原创 C++关键字之inline

C++关键字之inline什么是inline?一般在调用函数时会产生该函数的栈帧结构,在栈帧结构中保存关于该函数的参数、变量等临时数据;另外还要保存现场,函数返回后还要恢复现场。这些都要花费一些时间。如果有的函数需要频繁使用,则在反复调用的过程中会有很大的时间开销,降低程序运行效率。C++提供了一种提高效率的方法,即在编译时将所调用的函数的代码直接嵌入到主调函数中,而不是将流程...

2018-06-15 21:39:43 12616

原创 C++默认的6个成员函数

C++默认的6个成员函数何为默认?若programmer不定义或调用,则编译器会自动定义或调用它默认的方法。1. 构造函数用来初始化对象的成员变量。 特点: 1. 函数名与类名相同 2. 没有返回值 3. 新对象被创建时,由编译器自动调用,且在对象的生命周期内仅调用 一次 4. 构造函数可以重载,实参决定了调用哪个构造函数 5. 无参构造函数和全缺省的构造函数都认为是...

2018-06-15 20:33:42 12898

原创 C++关键字之const

C++关键字之constC中的constC中const修饰只读变量,编译器在编译期间不知道其存储的内容。通常不为普通 const 只读变量分配存储空间,而是将它们保存在符号表中,这使得它成为一个编译期间的值,没有了存储与读内存的操作。要想修改const修饰的变量的值, 可用volatile修饰。因为: 用volatile修饰的变量表示可以被某些编译器未知的因素更改,比如操作系统、...

2018-06-15 20:16:22 12584

原创 C++关键字之static

C++关键字之static静态成员静态成员的提出是为了解决数据共享的问题。实现数据共享有许多种方法,其中使用全局性的变量或对象是一种方法。但是全局性会带来一个问题: 不安全性——全局量在程序任何地方都可以更新而不加限定,无法控制范围。静态成员包含静态数据成员和静态成员函数static的作用C++中的static的作用基本与C中static中一致。唯一的区别是C++中多了一...

2018-06-13 15:01:49 12695

原创 Core Dump

Core Dump事后调试 当一个进程要异常终止时,可以选择把进程的用户空间内存数据全部保存到磁盘上,文件名通常叫core,这叫做Core Dump。进程异常终止通常是因为有Bug,比如非法访问内存导致段错误,事后可以用gdb调试器检查core文件以查清错误原因,这叫做事后调试。一个进程允许产生多大的core文件取决于进程的Resource Limit。 系统默认不允许产生core文件的,是...

2018-06-13 11:41:57 13283

原创 C++之友元

C++之友元友元分为友元函数和友元类友元函数友元函数可以直接访问类的私有成员,它是定义在类外部的普通函数,不 属于任何类,但需要在类的内部声明,声明时需要加friend关键字class Date{friend void PrintDate(const Date& d);public: Date(int year, int month, int day...

2018-06-13 10:48:51 12673

原创 C++操作符重载

C++操作符重载重载操作符是具有特殊函数名的函数,关键字operator后面接需要定义的操作符符号。操作符重载也是一个函数,具有返回值和形参表。它的形参数目与操作符的操作数目相同,使用运算符重载可以提高代码的可读性返回值 重载操作符的特点: 1. 定义某种重载时定义方式与定义普通函数基本一致,唯一的区别就是在“操作符名”前加上关键字“operator”. 2. 虽然定义时...

2018-06-13 10:31:35 12680

原创 大小根堆

大根堆、小根堆定义结构体typedef int DataType;typedef struct StaticSequenceList{ int size; int capacity; DataType *datas; int (*function)(int, int);}Pile, *QPile;创建大小根堆int my_cmp_bigg...

2018-05-14 16:18:57 13413

原创 二叉树的遍历

二叉树的遍历0. 基础数据结构0.1 栈typedef struct SNode{ PBTNode pbtnode;}SNode;typedef struct StaticStack{ int top; int bottom; SNode Node[MAXLEN];}SStack;0.2 队列typedef struc...

2018-05-06 19:12:17 12673

原创 Linux 进程通信

Linux 进程通信1.传统进程通信1.1 信号信号机制是在软件层次上对中断机制的一种模拟。 信号的捕获与处理也成为系统的“软中断”机制。1.1.1 常用信号每个信号都有一个编号和宏定义的名称,这些名字都已SIG开头。宏定义在signal.h头文件中。1.1.2 信号的处理缺省操作,默认的信号处理方式。SIG_DFL 忽略信号,进程忽略接收到的信...

2018-05-06 14:31:38 12902

原创 动态规划之0-1背包

题目动态规划之0-1背包问题有N件物品和一个容积为M的背包。第i件物品的体积w[i],价值是v[i]。求解将哪些物品装入背包可使价值总和最大。每种物品只有一件,可以选择放或者不放(N<=3500,M <= 13000)。思路对于这个问题而言,许多人的第一反应就是求每件物品的平均价值,然后最先装平均价值最大的物品。然而,这样的贪心法是不对的。假如这种情况: 假设背包...

2018-04-26 21:54:56 13028

原创 数据结构之复杂链表复制

数据结构之复杂链表的复制1. 什么是复杂链表?所谓复杂链表,指的是个链表的每个节点,有一个指向next指针指向下一个节点,还有一个random指针指向这个链表中的一个随机节点或者NULL。什么意思呢?我们来看图说话 如图,每个结点都用next指针指向下一个结点的同时,还用random指针指向任意的结点,注意这里的random指针的指向是随心所欲的,可以指向任何结点(包括NUL...

2018-04-20 10:30:18 13244

原创 数据结构之单链表的相交与环的问题

数据结构之单链表的相交与环的问题一、单链表不带环相交如果两个单链表不带环,可以把它们的相交分成以下两种情况: T型、V型1. T型这种形式的相交指的是一个单链表的尾(注意:这里只能是尾而不能是头)指向了另一个单链表的中间位置。 2. V型这种形式的相交指的是一个单链表的尾指向了另一个单链表的尾。值得注意的是这里只能是被指向单链表的尾,因为如果是被指向单链表的...

2018-04-19 22:51:34 26780

原创 Linux文件的系统调用

Linux文件的系统调用文件描述符操作系统识别文件的唯一标识。当进程创建一个新文件或者打开现有文件时,系统内核向进程返回一个文件描述符。范围为0~255三个特殊的文件描述符前三个文件标识符在系统中规定为: #define STDIN_FILENO 0 //标准输入文件 #define STDOUT_FILENO 1 //标准输出文件 #define ST...

2018-04-18 08:42:39 15265

原创 Linux 进程的系统调用

Linux 进程的系统调用子进程创建fork() 创建子进程。fork()后会有两个并发进程执行,子进程复制了父进程的数据段,包括全局变量。父进程返回子进程的PID, 子进程返回0。 头文件:stdio.h vfork() 子进程与父进程共享地址空间。调用vfork()创建的子进程后,父进程被挂起,直到子进程结束。头文件:stdio.h进程映像的更换用新的程序代码覆盖原...

2018-04-18 07:52:06 14616

原创 gcc 链接文件

gcc 链接文件生成静态库gcc -c add.c minus.c ar rcv libtest1.a add.o minus.o链接静态库方法一: gcc -o test test.c libtest1.a方法二: gcc -o test test.c -L. -ltest1生成动态库gcc -c add.c minus.c gcc -shared...

2018-04-15 12:03:06 14431

原创 makefile

makefile对多文件构成的大中型软件项目进行编译、调试的工具工作机制有5个源文件 main.c function1.h function1.c function2.h function2.cmain.c#include "function1.h"#include "function2.h" int main(int argc, char **argv){...

2018-04-15 12:01:54 12618

空空如也

空空如也

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

TA关注的人

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