自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 线程常见问题

条件变量的控制判断需要使用循环进行,避免在多个线程同时被唤醒的情况下,A线程加锁成功访问资源,其他线程卡在锁处,而A线程一旦解锁,其他线程抢到锁在资源访问条件不满足的情况下访问资源。线程同步指的是线程间对数据资源进行获取,有可能在不满足访问资源条件的情况下访问资源而造成程序逻辑混乱,因此通过进行条件判断来决定线程在不能访问资源时休眠等待或满足资源后唤醒等待的线程的方式实现对资源访问的合理性。线程安全指的是当前线程中对各项操作时安全的,但不表示内部调用的函数是安全的,两个之间并没有必然关系。

2024-04-09 21:42:27 752

原创 四种锁(互斥锁,递归锁,读写锁,自旋锁)

互斥锁

2024-04-09 20:22:55 357

原创 进程间通信常见问题

11.多个进程在通过管道通信时,删除管道文件可以继续通信,管道的生命周期随进程,本质是内核中的缓冲区,命名管道文件只是标识,用于让多个进程找到同一块缓冲区,删除后,之前已经打开管道的进程依然可以通信。进程之间具有独立性,拥有自己的虚拟地址空间,因此无法通过各自的虚拟地址进行通信(A的地址经过B的页表映射不一定映射在什么位置)14.共享内存的删除操作并非直接删除,而是拒绝后续映射,只有在当前映射链接数为0时,表示没有进程访问了,才会真正被删除。4.多个进程只要能够访问同一管道就可以实现通信,不限于读写个数。

2024-02-16 10:22:58 433

原创 信号的产生

中断是计算机系统中的一种机制,用于在CPU执行指令的过程中暂停当前任务,转而执行特定的处理程序(称为中断处理程序或中断服务程序),以响应硬件或软件产生的事件或条件。操作系统中会有很多个进程,我们可以创建一个闹钟,那么其他进程也可以创建闹钟,这样就会存在很多个闹钟,那么这些闹钟是怎么管理的呢?此时就意味着硬件产生了异常。在这段代码中,有除0操作,我们知道,除0得到的是无穷大的数,所以在编程的时候是不允许出现的。随着时间片的轮转,这个导致硬件异常的进程还会不停的调到,所以操作系统会不停的向进程发送信号。

2024-02-14 20:39:07 827

原创 System V信号量

同步(Synchronization):同步是指在多进程或多线程环境中,控制进程或线程之间的执行顺序,以保证它们按照某种规定的顺序执行或在特定的时间点上进行协作。互斥(Mutual Exclusion):互斥是指在多进程或多线程环境中,对共享资源的访问是排他的,即同一时间只允许一个进程或线程访问共享资源。在执行完临界区的代码后,进程会增加信号量的值,表示释放了一个资源。表示资源数目的计数器,每一个执行流想访问公共资源内部的某一份资源,不应该让执行流先访问,而是先申请信号量资源,其实就是。

2024-02-11 17:41:19 378

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

如上图中,当读取方需要的是香蕉,但是队头是苹果,此时就可以跳过苹果,读取香蕉,并且靠近队头的香蕉先被读取。struct ipc_perm*,变量名是msg_perm,结构类型和共享内存的一样。0:读取队列中的第一条消息(不在乎当前队列头元素是什么消息类型,将他当作普通队列来处理)。当发送方有数据发送时,将数据先打包成一个节点,然后尾插到内核中的消息队列中去。当接收方接收数据时,从队列头部开始去找所需要的节点,然后进行解包得到数据。通信双方不会和消息队列进行挂接,而是像管道一样,访问内存中的消息队列。

2024-02-11 16:13:31 435

原创 system V共享内存

共享内存是最快的IPC形式(inter-process communication),一旦这样的内存映射到共享它的进程的地址空间,这些进程间数据传递不在涉及到内核,即进程不再通过执行进入内核的系统调用来传递彼此的数据。所以,在开辟共享内存之前,必须先使用ftok函数来生成一个独一无二的key值,这样才能保证我们内存块的标识是唯一的。由于指令也是shell上运行的进程,也是属于用户层,所以操作共享内存时,使用的时shmid,而不是key值。每次开辟的共享内存,最小也是4KB的。

2024-02-11 00:53:51 1228

原创 进程间通信-匿名管道与命名管道

进程控制:有些进程希望完全控制另一个进程的执行(如Debug进程),此时控制进程希望能够拦截另一个进程的所有陷入和异常,并能够及时知道它的状态改变。返回值:如果成功,返回读取的字节数,如果已到达文件末尾,则返回 0,如果出错,则返回 -1,并设置全局变量 errno 来指示错误的类型。返回值:如果成功,返回写入的字节数,如果出错,则返回 -1,并设置全局变量 errno 来指示错误的类型。我们可以看到,管道文件是可以直接在磁盘上存在的,和进程无关,这一点和命名管道不一样,其他的特征都一样。

2024-02-10 21:46:11 1377

原创 动态库与静态库 动态链接与静态链接

(ln -s/home/user/file.txt /home/user/link.txt,这个命令会在/home/user目录下创建一个名为link.txt的符号链接文件,指向/home/user/file.txt文件。将自己的动态库路径放入到环境变量中,再执行刚刚生成的可执行程序,发现可以成功执行了,而且使用的是动态库中的函数接口。当执行到库函数的时候由运行时的链接文件跳转到系统中的标准库中,去链接标准库中库函数的.o文件。静态库:库文件,以.a为后缀(Windows中为.lib)

2024-02-10 21:36:31 1584

原创 左值右值引用,完美转发

打印value的值’A’,开始下一轮递归。为了避免 构造临时对象,深拷贝进行拷贝构造,再构造的重复流程,使用移动构造,构造临时对象通过移动构造将资源转移到临时对象中,而临时对象本身又是右值(将亡值),构造的时候会将临时对象的资源转移到要构造的对象中。,它里面包含着0到N个模板参数,我们是无法直接获取参数包args,只能通过展开参数包的方式获取参数包的每个参数,语法不支持args[i]的方式获取可变参数。一般认为,可以放在=左边的,或者能够取地址的,称为左值,只能放在等号右边的,或者不能取地址的,称为右值。

2023-12-22 21:56:21 850

原创 RAII智能指针

假设我们要使用定义一个双向链表,如果我们想要让创建出来的链表的节点都定义成shared_ptr智能指针,那么也需要将节点内的_pre和_next都定义成shared_ptr的智能指针。在对象构造时获取资源,控制着对资源的访问使之在对象的生命周期内始终保持有效,最后在对象析构的时候释放资源。智能指针本质就是一个类模板,可以创建任意类型的指针对象,当智能指针对象使用完后,对象就会自动调用析构函数去释放指针所指向的空间。如果引用计数减为0,则表示自己是最后一个使用该资源的shared_ptr对象,必须释放。

2023-12-20 20:51:11 389

原创 特殊类设计

的,因为如果要调用公有函数,需要有一个对象示例,而我们要用公有函数创建一个示例,而我们现在没有对象示例,需要调用公有函数(类似鸡生蛋,蛋生鸡)…如果函数在静态区,就可以直接调用了。如果我们需要对堆上创建的对象进行销毁,我们可以提供一个公有函数接口,用这个函数接口调用私有函数。但是提供一个可以在堆上创建对象的公有函数,这样我们就可以通过公有函数来调用私有的构造函数。我们可以将析构函数私有化,因为在栈上和静态区的对象需要自动调用析构函数,而析构函数无法显示调用了,就会导致我们无法在栈上和静态区创建对象。

2023-12-10 16:45:40 75

原创 位图及有关海量数据处理

数据是否在给定的整型数据中,结果是在或者不在,刚好是两种状态,那么可以使用一个二进制比特位来代表数据是否存在的信息,如果二进制比特位为1,代表存在,如果为0,代表不存在。②.每个值映射一个比特位,需要开多少个比特位?并非40亿个,而是2^32个(42亿9千万),开空间开的不是数据个数,而是数据范围。①.如果用排序加二分查找,40亿个数需要16g内存,内存开不出这么大连续空间。各自映射到一个位图,如果一个值在两个位图都存在,则是交集。出现两次及以上 1 0。我们考虑使用两个位图。出现3次及以上1 1。

2023-11-25 20:23:53 123

原创 c++多态

虚函数的继承是一种接口继承,派生类继承的是基类虚函数的接口,目的是为了重写,达成多态,继承的是接口,所以如果不实现多态,不要把函数定义成虚函数。派生类在重写基类虚函数时,与基类虚函数返回值类型不同,即基类虚函数返回基类对象的引用或指针,派生类虚函数返回派生类对象的引用或指针。如果是普通对象,是一样快的,如果是指针对象或者是引用对象,则调用普通函数快,因为构成多态,运行调用虚函数需要到虚函数表中去查找。A有虚函数,B,C虚拟继承A,D继承B,C,也是有两张虚表,B,C共享A的虚表,D单独创建一个虚表。

2023-10-23 14:27:45 91

原创 c++继承

64位平台指针大小为8,B与C都是虚拟继承A,故一个A单独在D下面,大小为4,B和C内含一个虚基表指针,大小为8,还各自有一个int变量,由于这里默认对齐数为8,由于内存对齐的缘故,B和C的大小为16,只有一个A,D中还有一个int变量,故sizeof(D)为40。②.基类的私有成员在派生类都是不可见的,基类的其他成员在子类的访问方式=min(成员在基类的访问限定符,继承方式)public>protected>private。组合是一种has-a的关系,假设B组合了A,每个B对象中都有一个A对象。

2023-10-22 20:18:07 112

原创 迭代器失效问题

迭代器失效是一种现象,由特定操作引发,这些特定操作对容器进行操作,使得迭代器不指向容器内的任何元素,或者使得迭代器指向的容器元素发生了改变。

2023-08-15 10:59:31 351

原创 c/c++内存管理

⑥.申请自定义类型对象时,malloc/free只会开辟空间,不会调用构造函数和析构函数,而new在申请空间后悔调用构造函数完成对象的初始化,delete在释放空间前会调用析构函数完成空间中资源的清理。new和delete申请和释放的是单个元素的空间,new[]和delete[]申请和释放的是多个元素的空间,new在申请失败空间时会抛异常,malloc会返回NULL。④.malloc的返回值为void*,在使用时必须强转,new不需要,因为new后面跟的是空间的类型。//动态申请10个int类型的空间。

2023-08-02 00:16:13 203

原创 c++的类与对象(下)

如果一个类定义在另一个类的内部,这个内部类就叫做内部类,此时内部类是一个独立的类,不属于外部类,不能通过外部类的对象去调用内部类,外部类对内部类没有任何优越的访问权限。声明为static的类成员称为类的静态成员,用static修饰的成员变量,称为静态成员变量,用static修饰的成员函数,称为静态成员函数,内部类是外部类的友元类,内部类可以通过外部类的对象参数来访问外部类中的所有成员,但是外部类不是内部类的友元(友元关系不具有交换性)

2023-07-31 11:49:18 119

原创 类与对象(中)

(系统默认生成的析构函数与系统默认生成的构造函数类似,对于内置类型不会处理,对于自定义类型会自动调用该自定义类型的析构函数,像int*p,不会去释放p所指向的空间,因为指针类型都是内置类型)如果采用浅拷贝,将对象浅拷贝,对象中如果有动态开辟的内存,拷贝的对象析构后,动态开辟的内存被释放,而原对象也要析构,所以会造成double free,两次释放的问题。析构函数,与构造函数功能相反,析构函数不是完成对象的销毁,局部对象销毁工作是由编译器完成,而对象在销毁时会自动调用析构函数,完成类的一些资源清理工作。

2023-07-30 17:27:55 148

原创 c++的类与对象(上)

结论:一个类的大小,实际就是该类中"成员变量"之和,当然要进行内存对齐,注意空类的大小,空类比较特殊,编译器给了空类一个字节来唯一标识这个类。④.如果嵌套了结构体的情况,嵌套的结构体对齐到自己的最大对齐数的整数倍处,结构体的整体大小就是所有最大对齐数(含嵌套结构体的对齐数)的整数倍。c++实现封装的方式:用类将对象的属性和方法结合在一起,让对象更加完善,通过访问权限选择性的将其接口提供给外部的用户使用。的,关注的是对象,将一件事拆分成不同的对象,靠对象之间的交互完成。

2023-07-23 23:57:49 56

原创 C++入门(未完待续)

当然引用也能做返回值,但是要特别注意,我们返回的数据不能是函数内部创建的普通局部变量,因为在函数内部定义的普通的局部变量会随着函数调用的结束而被销毁。为什么会出现随机值,因为你在函数里定义的变量是临时变量,出了函数函数是会销毁的,这时它就随机指向内存中的一块空间了。注意cin的特点,与c语言中gets有些类似,gets是遇到换行符停止,而cin是遇到空格,tab或者换行符作为分隔符的,缺省参数是声明或定义函数时为函数的参数指定一个默认值,在调用该函数时,如果没有指定实参则采用该默认值,否则使用指定的实参。

2023-07-18 21:19:00 867

原创 几种排序(堆排序,插入排序等)

选择排序(注意如果maxi为begin,那么再将begin与mini对换的时候,maxi其实是现在mini指向的,故要让maxi=mini。

2023-07-10 22:03:15 37

原创 用队列实现栈与用栈实现队列(c语言版)

pop时只要nonempty大于1个元素就将nonempty的元素弹到empty中去,最后一个为要pop的。只要queue1不为空,就返回obj->queue1队尾的元素,为空返回obj->queue2队尾的元素。如果popstack这个栈不为空,那么就将pushstack的元素全部转移到popstack中去,只要nonempty的元素个数大于1,那么就将nonempty的元素出队列到empty中去。push时只要queue1不为空就向queue1中进元素,为空就向queue2进元素。

2023-05-15 21:19:02 43

原创 双向带头循环链表的应用

【代码】双向带头循环链表的应用。

2023-05-12 20:21:40 41

原创 力扣143题:重排链表

先写middlenode函数找到中间节点的前一个节点,两种写法,可以使用虚拟头结点也可以不用。然后将反转mid->next,将mid之后的节点进行反转(reversenode函数)首先找到链表中间节点的前一个节点,这里记作为mid(middlenode函数)不能只是单纯的改变节点内部的值,而是需要实际的进行节点交换。之后让mid->next=NULL;一个链表分成了两个链表。之后进行交叉合并(mergelist函数)反转链表函数reversenode。

2023-05-09 17:24:53 70

原创 链表(未完待续)

给你一个链表的头节点 head 和一个整数 val ,请你删除链表中所有满足 Node.val == val 的节点,并返回 新的头节点。// fast再提前走一步,因为需要让slow指向删除节点的上一个节点。采用三指针的方法,n1指向NULL,n2指向头结点,n3指向头结点的下一个结点。这里让left指向虚拟头结点,让right指向虚拟头结点的下一个,然后不断迭代。让快慢指针都从头结点开始,快指针每一次都比慢指针快走一步。6力扣19题 删除链表的倒数第n个结点.3.力扣876题-链表的中间节点。

2023-04-25 22:21:49 35

原创 算法的时间复杂度和空间复杂度

算法的时间复杂度和空间复杂度(未完待续,还有递归的时间复杂度详解

2023-04-13 22:09:24 50

原创 c语言补漏

const定义的只读变量从汇编的角度来看,只是给出了对应的内存地址,而不是像#define一样给出的立即数,所以,const定义的只读变量在程序运行过程中只有一份备份(因为它是全局的只读变量,存放在静态区),而#define定义的宏常量在内存中有若干个部分。代码1这时候编译器对代码进行优化,因为在代码1的语句中,i没有被用作左值(没有被赋值),这时候编译器认为i的值没有发生改变,所以在第一条语句从内存中取出i的值赋值给j后,这个值并没有被丢掉,而是在第二条语句继续给k赋值。//此时并未将N放入内存中。

2023-04-06 18:35:27 46

原创 预处理(预定义符号,宏和函数的对比,#和##,命令定义,#include,#undef等

undef 这条指令用于移除一个宏定义#undef NAME //如果现存的一个名字需要被重新定义,那么它的旧名字首先要被移除命令行定义许多C 的编译器提供了一种能力,允许在命令行中定义符号,用于启动编译过程例如:当我们根据同一个源文件要编译出一个程序的不同版本的时候,这个特性有点用处。(假定某个程序中声明了一个某个长度的数组,如果机器内存有限,我们需要一个很小的数组,但是另外一个机器内存大些,我们需要一个数组能够大些,这时通过命令行定义,可以控制数组的大小)提前不给,在命令行给。

2023-04-06 16:27:42 171

原创 程序环境(翻译环境和执行环境)

③.开始执行程序代码,这个时候程序将使用一个运行时堆栈(stack),存储函数的局部变量和返回地址,程序同时也可以使用静态(static)内存,存储于静态内存中的变量在程序的整个执行过程,一直保留他们的值。①.程序必须载入内存中,在有操作系统的环境中一般由操作系统来完成,在独立的环境中,程序的植入必须由手工安排,也可能是通过可执行代码置入只读内存来完成。没有复杂语法,也没有语义,也不需要优化,只需要一一对应的翻译即可,最后生成目标文件,Windows中的.obj,Linux中的.o。

2023-04-03 18:25:16 165

原创 语言文件操作

每个被使用的文件都会在内存中开辟了一个内存信息区,用来存放文件的相关信息(如文件的名字,文件状态及当前文件的位置),这些信息是保存在一个结构体变量中的,该结构体类型是由系统声明的,取名FILE。定义pf是一个指向FILE数据类型的指针变量,可以使pf指向某个文件的文件信息区,通过该文件信息区中的信息就能访问改文件,即通过文件指针变量能找到与它相关联的文件。注意,输入与输出都是站在程序/内存的角度来看的,要把文件中的内容放到程序/内存中是输入,要把内存/程序中的内容放到文件中是输出。

2023-03-30 22:25:14 103

原创 动态内存管理

动态内存管理(malloc,calloc,realloc,free)函数的使用

2023-03-23 19:02:04 45

原创 结构体,枚举,联合(未完待续)

关于结构体,位段,枚举,联合体(共用体)的相关知识

2023-03-19 15:25:21 60

原创 调整数组使得奇偶分离(双指针),杨氏数组,判断字符串是否为另一个字符串旋转之后的字符串,左旋字符串的第二种法解法(第一种为正常轮转,第三种为数组映射,第四种为三步反转法))

有一个数字矩阵,矩阵的每行从左到右是递增的,矩阵从上到下是递增的,请编写程序在这样的矩阵中查找某个数字是否存在。所以做法很简单,只需要将原字符串再来一遍接在后面,然后找一找待查找的字符串是不是两倍原字符串的子集即可。其实ABCDE无论怎么旋,旋转后的所有结果,都包含在了ABCDEABCDE这个字符串里了。3.写一个函数,判断一个字符串是否为另外一个字符串旋转之后的字符串。来调整该数组中数字的顺序使得数组中所有的奇数位于数组的前半部分,AABCD左旋一个字符得到ABCDA。输入一个整数数组,实现一个函数,

2023-03-16 20:58:50 80

原创 字符函数和字符串函数(未完待续)

关于字符串函数的使用strlen strcmp strcat strcmp strcpy strncat strncmp strstr strchr strrchr

2023-03-11 20:59:02 65

原创 指针八道笔试题

2023-03-08 20:39:23 37

原创 关于合并在数据结构中的应用

关于合并思想的应用

2023-03-06 20:56:23 128

原创 二进制运算

有关二进制的习题,&,|,^,的实际用法

2023-03-05 19:48:26 118

原创 c语言链表基本常识

c语言链表的相关知识

2023-03-03 21:20:35 93

原创 指针和数组题目

指针与数组的题目,重点考察sizeof和strlen的用法,牢记strlen的参数传入的是地址

2023-03-03 20:23:44 48

空空如也

空空如也

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

TA关注的人

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