自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 ffmpeg入门

◆ ffmpeg.exe:用于音视频转码, 也可以从url/现场音频/视频源抓取输入源。◆ ffplay.exe:一个非常简单和可移植的媒体播放器,使用FFmpeg库和SDL库。◆ ffprobe.exe:查看多媒体文件的信息。

2024-04-18 14:50:33 155

原创 C++11中lambda函数

其中,[capture]: 捕捉列表。捕捉列表总是出现在lambda函数的开始处。事实上,[]是lambda引出符。编译器根据该引出符判断接下来的代码是否是lambda函数。允许访问当前作用域下的某一个(些)变量语法上,捕捉列表由多个捕捉项组成,并以逗号分割。捕捉列表有如下几种形式:[var] 表示值传递方式捕捉变量var。[=] 表示值传递方式捕捉所有父作用域的变量(包括this)。[&var] 表示引用传递捕捉变量 var。[&] 表示引用传递捕捉所有父作用域的变量(包括this)。

2024-04-15 15:33:25 262

原创 Jsoncpp简单使用

Jsoncpp是个跨平台的C++开源库,提供的类为我们提供了很便捷的操作,而且使用的人也很多。新API使用方法参考(new出内存,新的API如果反复调用的话会产生大量内存碎片)jsoncpp库中的类被定义到了一个Json命名空间中。Value -> 对Json支持的数据类型进行封装/解析。旧API使用方法参考。

2024-04-15 11:37:21 296

原创 libcurl 简单使用

LibCurl是一个开源的免费的多协议数据传输开源库,该框架具备跨平台性,开源免费,并提供了包括HTTPFTPSMTPPOP3等协议的功能,使用libcurl可以方便地进行网络数据传输操作,如发送HTTP请求、下载文件、发送电子邮件等。它被广泛应用于各种网络应用开发中,特别是涉及到数据传输的场景。

2024-04-11 14:44:33 831

原创 Libevent的使用

libevent入门使用

2023-12-28 15:16:08 797

原创 线程池:一个锁,两个条件变量,循环队列

线程池,事先创建几个线程,不停取任务,如果没有任务休眠,省去了不停的创建线程销毁销毁线程的事件和资源。

2023-12-26 17:36:55 411 1

原创 排列组合(STL算法中next_permutation和prev_permutation剖析)

STL提供了两个用来计算排列组合关系的算法,分别是“下一个”排列next_permucation和 “上一个” 排列 prev_permutation。解决全排列问题

2023-03-15 20:25:20 454

原创 “划分”思想,Lomuto划分(单向)

Lomuto划分,将数组分为连续的三段,一段为已知(以p为基数划分)的元素,一段为已知的元素,还有一段过的元素。(算法初始前两段为空)

2022-10-23 14:49:20 1217 3

原创 I/O复用

poll、epoll、select

2020-04-27 12:36:38 281

原创 传统的操作系统中“线程”和“进程”的区别,Linux中独特线程机制

操作系统引入进程是为了使多个程序能并发执行,以提高资源利用率和系统吞吐量。而引入线程,则是为了减少程序在并发执行时所付出的时间和空间开销,使操作系统有更好的并发性。传统的操作系统(Microsoft Windows或 Sun Solaris等)中线程和进程的比较:“基本单位”不同: 进程是资源分配的基本单位,是系统进行资源分配和调度的一个独立单元,拥有独立的资源。但是进程调度和创建或...

2019-10-06 00:37:48 281

原创 不使用循环,求二进制中1的个数

对于2位的二进制数,求其中1的个数。有一个奇妙的算法。(设x , y,z代表二进制中一位比特位的值)已知 i (x1 x2),j = (0 x1)。则i-j 所对应的的十进制数就是 i 中1的个数。i j i - j 00 00 00 01 00 01 10 01 01 11 01 10 那么对于...

2019-09-29 22:27:49 1555 3

原创 寻址方式

Intel X86 CPU 系列的寻址方式:处理器:8086、8088、80186、80286、80386、80486 以及后面的各种型号的Pentium芯片。8086和8088 是16 位(算术逻辑单元)处理器,从80386开始为32位处理器。80286仍为16位处理器,但其寻址方式开始从“实地址模式”到“保护模式”过渡。8086 是16位CPU,1M(2^20)字节内存地址(2...

2019-09-28 10:49:25 592

原创 UDP用户数据报协议、TCP传输控制协议

UDP的首部,TCP的首部:为什么不是两次握手?三次挥手,半关闭,端口复用

2019-08-03 16:32:52 870

原创 深度分析进程创建过程(linux 2.4) —— 《LINUX内核源代码情景分析》阅读笔记

进程:实际上是复制出来的,第一个进程是系统固有的(在内核引导下完成初始化),所有其他进程都是其“后代”。创建:Linux提供三个系统调用函数pid_t fork(void);是全部复制,父进程的资源全部通过数据结构复制给子进程int _clone(int(*fn)(void *arg), void * child_stack, int flags, void *arg);选择复制,...

2019-07-24 20:43:03 592

原创 函数调用栈帧过程

栈帧就是一个函数执行的环境。实际上,栈帧可以简单理解为:栈帧就是存储在用户栈上的(当然内核栈同样适用)每一次函数调用涉及的相关信息的记录单元。栈是从高地址向低地址延伸的。每个函数的每次调用,都有它自己独立的一个栈帧,这个栈帧中维持着所需要的各种信息。对于一个简单的C程序的执行过程是怎么样的?我们先认识几个寄存器:eax:累加(Accumulator)寄存器,常用于函数返回值。e...

2019-07-21 17:37:07 364

原创 二叉树 ——(创建与非递归遍历)

二叉树定义:二叉树是结点的有限集合,这个集合或者是空的,或者由一个根结点或两棵互不相交的称为左子树的和右子树的二叉树组成。特点:1)每个结点至多有二棵子树(即不存在度大于2的结点)2)二叉树的子树有左、右之分,且其次序不能任意颠倒两种特殊的二叉树:(1)满二叉树:一棵深度为k且有2k-1个结点的二叉树。(对树中结点按从上到下、从左到右的顺序进行编号)(...

2019-07-20 15:23:36 554

原创 进程间通讯 --- 消息队列、信号量、共享内存(XSI IPC结构)

XSI IPC结构:源自System V UNIX(1983)的IPC功能(为了满足进程间通信,首次引入三中进程间通信机制(IPC):消息队列、信号量、共享内存)。IPC结构(消息队列、信号量、共享内存)通过共同的IPC资源通信,而IPC资源是通过内核中IPC结构的一个非整数的标识符来区分的,类似于管道通信的文件描述符(XSI IPC不使用文件系统名字空间,构造了自己的名字空间)。但是IPC...

2019-03-13 12:10:13 305 1

原创 进程间通讯 --- 管道(半双工通信)

管道:一个进程输出数据到另一个进程数据输入的通道。(半双工通信:同一时间,只能一端读另一端写,因为只有一条信道)有名管道(命令管道):在磁盘上会存在一个管道文件标识,但管道文件不占用磁盘block空间,数据会缓存在内存上。可应用于同一台主机上的有权限访问的任意n个进程间通讯。(必须有一对读写进程)有名管道使用:创建管道文件: 命令 mkfifo 文件名...

2019-03-05 13:53:02 843

原创 排序 - - -归并排序(二路归并)

二路归并排序:基本思想:将两个有序表合并成一个有序表。(将下列两个已排序的顺序表合并成一个已排序表。顺序比较两 者的相应元素,小者移入另一表中,反复如此,直至其中任一表都移入另 一表为止。)二路归并排序的基本思想是将两个有序表合并成一个有序表。给定排序码46,55,13,42,94,05,17,70,二路归并排序过程为://将两个有序序列合并void ...

2019-01-30 19:15:53 1888

原创 排序 - - - 选择排序(简单选择、堆排序)

选择排序:基本原理: 将待排序的元素分为已排序(初始为空)和未排序两组,依次将未排序的元素中值最小的元素放入已排序的组中。简单选择排序:简单选择排序的基本过程为:(1)在一组元素R[i]到R[n]中选择具有最小关键码的元素(2)若它不是这组元素中的第一个元素,则将它与这组元素中的第一个元素对调。(3)除去具有最小关键字的元素,在剩下的元素中重复第(1)、(2...

2019-01-28 13:53:40 573

原创 排序 - - - 交换排序(快速排序、冒泡排序)

交换排序:通过排序表中两个元素的比较,若与排序要求相逆(不符合升序或降序),则将两者交换。快速排序:基本思想:任取待排序序列中的某个元素作为标准(也称为支点、界点,一般取第一个元素),通过一次划分,将待排元素分为左右两个子序列,左子序列元素的排序码均小于基准元素的排序码,右子序列的排序码则大于或等于基准元素的排序码,即找到该元素在数组中顺序排序的位置。然后分别对两个子序列继续进行...

2019-01-21 17:22:37 1729

原创 排序 - - - 插入排序(直接插入排序、希尔排序)

插入排序:基本思想:每次将一个待排序的元素,按其元素的大小插入到前面已经排好序的序列的适当位置,直到全部元素插完成为止。直接插入排序:基本思想:把n个待排序的元素看成为一个有序表和一个无序表,开始时有序表中只包含一个元素,无序表中包含有n-1个元素,排序过程中每次从无序表中取出第一个元素,把它的排序码依次与有序表元素的排序码进行比较,将它插入到有序表中的适当位置,使之成为新的有序表。...

2019-01-20 11:37:55 413

原创 内存池

内存池:为了解决new、malloc申请内存块的大小不定,频繁使用会产生大量的内存碎片、效率低等问题。基本思想:在真正使用内存前,先申请分配一定数量的、大小相等的内存块备用。当有新的内存需求时,就从内存池中分出一部分内存块,若内存块不够再继续申请新的内存。内存分配alloc():申请一定数量的、大小相等的内存块,当使用内存时,从内存池中分出一部分内存块void* alloc(si...

2019-01-12 14:06:40 191

原创 C++单例模式

单例模式:该类只生成一个对象,该类返回一个引用或指针(永远是指向唯一的对象),定义一个静态的方法来得到该类的唯一对象。(屏蔽构造函数,类中提供一个接口生成对象,不能依赖对象调用,不能返回类类型。)第一种,懒汉模式 /延时加载。对象存放在堆区,运行时生成对象(注意线程安全问题)class SingleTon{public: static SingleTon* getInsta...

2019-01-12 11:35:09 189

原创 初始化列表;常对象、静态对象的使用方法

初始换列表:class Test1{public: Test1(int a, int b) :ma(b), mb(a) { //等价 ma = b; mb = a; } void Show() { std::cout << "ma:" << ma << std::endl; std::cout << "mb:" ...

2018-11-30 18:19:56 306

原创 C++特性之封装:类与对象

封装:将东西包裹起来,使外界无法知道,只能通过某些特定的方式才能访问。其目的是增强安全性和简化编程,使用方无需知道其具体实现,只能通过外部接口以及特定的权限来使用其成员。C++中的类就是把属性和方法进行封装,同时对外部的访问通过访问限定符进行限制。而类是一种抽象的概念的数据类型,就像设计图一样,是对设计物抽象的描述,而真实存在的是物品。对于C++而言,对象是类的存在形式,占用内存空间。...

2018-11-27 12:02:23 323

原创 引用 '&' 与const

引用:由于按值传递参数时会为实参生成一个副本,需要花费大量时间和空间,并且无法修改实参。然而引用传递实参时,可以直接使用实参,并且可以修改实参。实例:int a = 10;int&amp; b = a; //b为a的别名void Swap(int&amp; a, int&amp; b){ int tmp = a; a = b; b = tmp;}引用的特点:...

2018-11-23 00:02:39 152

原创 虚拟地址空间

在进程创建的时候,操作系统会为之分配4G大小的地址空间(32位的CPU的寻址空间是4G)。4G虚拟地址空间,分为两部分:用户空间和内核空间(Linux:3/1; windows:2/2)。以Linux为例,如图,3G的用户空间(User Space)、1G的内核空间。保留区(128m)的空间是不允许访问的,意在防止操作干扰和页的加载约定。.text段(指令代码段):存放的是程序指令(函...

2018-11-19 18:32:23 312

原创 .c/.cpp程序生成可执行文件的过程

.c/.cpp文件生成到执行过程预编译:gcc -E main.c -o main.i main.i处理源代码文件中的“#”开始的预编译指令。如“#include”、“#define”等。具体如下: 宏替换:将所有的“#define”删除,并展开所有的宏定义。 处理条件预编译指令,如“#if" "#endif" "#elif" "#else"指令:表达式1为...

2018-11-19 18:05:10 2554

原创 malloc()、free()与new、delete的区别

定义与使用:malloc()和free()函数:动态内存分配(申请一块连续的指定大小的内存区域,以void *类型返回分配的内存区域地址)与释放函数(释放malloc函数给变量分配的内存空间)。C++/C语言的标准库函数。void *malloc(size_t size);void free (void *memblock);int *pC =(int *)malloc(si...

2018-11-18 19:26:32 207

原创 系统编程——进程创建fork()函数

fork()函数:创建一个子进程(拷贝父进程的PCB、页表,然后修改PCB中的部分数据);声明:#include <unistd.h>pid_t fork(void);返回值: 原来进程返回新进程PID,新进程返回0;出错返回 -1 ;fork函数测试(fork之后父子进程互为独立进程,操作系统决定谁先执行):运行结果:父子进程关...

2018-11-14 13:06:13 290

原创 字符串匹配算法——BF算法、KMP算法

BF算法(暴力匹配算法):将目标串的第一个字符与模式串的第一个字符进行匹配。如果相等,则继续匹配下一个字符;如果不等,模式串回退到第一个字符再与目标串的第二个字符匹配(每次匹配错误,目标串移动一个,模式串从头开始)。时间复杂度:O(M*N);代码实现:int BF(char *str1,char *str2){ assert(str1 != NULL &amp;&amp; s...

2018-11-14 00:03:28 479

原创 用于C和C++混合编程的 extern "C"

extern "C":C++语言提供,用来兼容C语言,实现C++代码调用C语言代码。extern "C"{代码段},代码段编译器会按照C语言的方式进行编译。(C++函数标识和C函数标识生成规则不同,所以在自己的环境里无法找到调用函数)extern:   可以置于变量或函数前,以表示变量或函数的定义在别的文件中可以使用。提示编译器遇到该函数时在其他文件中寻找其定义。extern也可用于进行连...

2018-11-12 16:24:36 209

原创 C++内联函数

内联函数:在编译期间,建议编译器在该函数被调用的地方生成函数体代码的副本,以避免函数调用的开销。但这往往会使程序变得很大。定义:限定符inline +函数体inline double Cube(double a){ return a*a*a;}int main(){ double v = Cube(3.2); printf("%f\n ",v); return 0;...

2018-11-12 15:18:45 213

原创 C/C++函数符号生成规则(函数名的修饰);C++ 函数重载

函数符号(函数的名字修饰):在编译阶段生成的字符串,来指明函数的定义或原型 。C函数符号生成规则:_cdel调用约定(C标准调用约定):函数名前加下划线。_stdcall调用约定:函数名前加下划线,函数名后加“@”符号和其参数字节。_fastcall调用约定:函数名前加“@”符号,函数名后加“@”字符和其参数字节。C++函数符号生成规则:_cdecl调用约...

2018-11-12 14:36:51 3708

原创 带参数默认值的函数

带参数默认值的函数说明:函数有一个或多个的参数有默认值;如float Area(float r = 3.5); int Sum (int a,int b = 5, int c =10)。带参数默认值函数注意:1、默认值参数只能放在函数声明或定义处,一般放在函数声明中。int Fun(int a, int b, int c = 9);int Fun(int a, int b, ...

2018-11-12 12:26:51 3346

原创 函数输出参数、不定参函数(printf不定参机制)、函数指针(回调函数、转移表)(c语言)

输出参数:解决函数需要多个返回值。#include <stdio.h>//实现一个函数返回两个值(最大值与最小值)int Max( int *arr,int len, int* min) //传min的地址,对父函数min的值进行修改{ int max= 0; *min = 0; for(int i=0;i <len-1;i++) { if (arr[i...

2018-06-02 01:57:53 1335

原创 二进制运算———位运算应用(二进制加减,求整数的二进制中“1”的个数)(C语言)

位运算符: &(按位与)、|(按位或)、^(按位异或)、~(取反)、<<(左移)、>>(右移)。1、 & 按位与:两数对应的二进制数位相与,两数位都为1时,该结果位才为1,否则为0。例如:3 & 5 == (0000 0011 & 0000 0101== 0000 0001)== 12、 |...

2018-05-31 23:27:05 4613 1

原创 结构体struct 的内存对齐问题(c语言)

内存对齐:为了避免移植后,计算机读取数据出错,

2018-05-12 23:56:20 588

原创 认识结构体与声明类型(typede)(c语言)

结构体:一系列具有相同类型或不同类型的数据构成的数据集合。定义:struct  结构体类型名   结构体变量名{成员表列;};如:建立学生信息类型的结构体,(包括学号、姓名、性别、年龄)。struct student st1{ int num; char name[20]; int age;};成员变量赋值: st1={001,"xiaoming",20};   //聚合体初始化结构体变...

2018-04-29 01:06:25 1219

复杂版线程池(头文件)

复杂版线程池:线程池中的线程数量管理。线程池中的线程数量需要限制在一定范围内,包括最小线程数、最大线程数和当前存活线程数。同时,运用线程池中的锁机制和存活线程数等概念,以便更好地管理线程池中的线程。此外,设立管理者线程的概念,用于监控和调度其他普通线程的工作。在动态地增加或删除线程数时,需要根据任务的数量和最大线程数来决定是否需要增加或减少线程数。管理者线程以便更好地管理线程的创建和销毁,提高程序的性能和稳定性。

2023-12-26

线程池优化版(管理者线程)

复杂版线程池:线程池中的线程数量管理。线程池中的线程数量需要限制在一定范围内,包括最小线程数、最大线程数和当前存活线程数。同时,运用线程池中的锁机制和存活线程数等概念,以便更好地管理线程池中的线程。此外,设立管理者线程的概念,用于监控和调度其他普通线程的工作。在动态地增加或删除线程数时,需要根据任务的数量和最大线程数来决定是否需要增加或减少线程数。管理者线程以便更好地管理线程的创建和销毁,提高程序的性能和稳定性。

2023-12-26

tcp包裹函数(出错处理封装函数)

tcp包裹函数(出错处理封装函数)

2023-12-26

tcp包裹函数(出错处理封装函数)

tcp包裹函数(出错处理封装函数)

2023-12-26

空空如也

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

TA关注的人

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