- 博客(34)
- 资源 (2)
- 收藏
- 关注
原创 现代C++ 实现单例模式
用DCLP实现的单例模式,单例对象的初始化顺序不确定。这种情况可能导致在一个线程中访问尚未初始化的单例对象,从而引发错误。 并不是线程安全,因为包含未定义行为。
2023-12-12 14:56:50 1046
原创 Linux下一切皆文件? -- 理解文件标识符fd
什么是文件标识符?最浅来看 文件标识符就是我们调用系统接口 open 打开文件时,open函数的返回值。但要深入理解它,我们得知道:1.文件打开的本质什么,操作系统如何管理被打开的文件?2.打开的文件与打开它的进程如何建立联系,也就是进程如何找到要操作的文件的?为什么它是访问文件的唯一凭证?
2022-10-25 18:22:15 1859 3
原创 彻底弄懂C++虚拟继承
为了解决普通继承的“数据冗余”和“二义性”的问题,C++引入了虚拟继承使得在多重继承下,基类成员只继承一份。这篇博客主要解析1.虚拟继承机制,如何做到的? 2.它和普通继承有什么区别?3.虚拟继承同时满足多态会怎样? .........
2022-07-27 11:41:41 10389 2
原创 Recv设置MSG_DONTWAIT依然阻塞
记录了服务器DEBUG,设置MSG_DONTWAIT依然阻塞的问题。使用gdb启动发现底层运行reactorIO模型的线程阻塞在了recv()上。ps aux |grep 发现进程还在,top 查一下发现cpu占用100%。还在调用recv时设置了MSG_DONTWAIT,用man手册说明查看,应该设置了便不会阻塞。当对端突然关闭连接,不会返回-1并且设置错误码。后来我只能耐心的把recv的说明仔细地看了一遍,终于发现了问题。每次遇到用户疯狂刷新,服务器就会瘫痪。
2024-01-17 22:20:04 866
原创 C++11 constexpr 常量表达式
本文讲解了C++11中引入的constexpr。讲解了它是什么,引入的原因以及使用的方法。更多的还需要在实际编程自己中体会。欢迎各位留言交流!
2023-12-11 17:35:13 407
原创 Linux man手册查找不到 常见问题总结
更新后man手册的pages路径变为 /opt/rh/devtoolset-XX(XX版本)/root/usr/share/man。1. cd /opt/rh/devtoolset-XX(XX版本)/root/usr/share。man手册的所有pages保存在 /usr/share/man。解决方案: 建立软连接即可重命名文件夹备份后建立软连接即可。
2023-05-17 11:55:42 997
原创 KMP算法 看这一篇就够了 图解刨析+代码
某一个位置出现匹配失败的时候,我们能否利用已知信息来免去不必要的比对?如图当指针分别指向 i,j处时,j之前的部分是完全一致的,能否挖掘这条信息的价值来提高效率?KMP算法的核心就是利用已知的信息来提高效率。
2023-01-14 18:07:14 1076
原创 Linux | 线程概念以及创建与等待
Linux操作系统并不是真线程操作系统,意味着没有专门描述组织线程的内核数据结构,所有线程都是通过进程PCB模拟的.进程是系统分配程序资源的基本单位,如虚拟内存,页表,文件描述符表,信号集...这些资源都是按照进程为单位来分配的!
2022-11-20 10:41:55 542 2
原创 什么是临界区 临界资源 原子性?
临界资源(Critical Resource): 一次只允许一个执行流访问的公共资源称为临界资源.比如在生活中,一个厕所隔间或者公交座位就是临界资源(常规情况下).临界区(Critical Section): 对公共资源进行访问的程序片段,也就是不加访问控制,会有安全问题的代码段.但在多线程的场景下,可能会出现多个执行流并发访问同一个公共资源的情况,这时候,我们就要通过各种方式,保证他是临界资源.如下这段代码下,全局变量ticket 被多线程共享,此时它时公共资源,但各线程并发对它读写,他就不是临界资源.
2022-11-18 17:31:10 434
原创 Linux | 进程信号 产生未决到递达
每个进程的PCB内都能找到3张表 block pending hander.不同的环境实现这三张表的方式可能略有区别,可以理解为block和 pending表示类似于位图的结构 hander表是指向信号对应处理方法的数组(指针数组).对于信号的理解就基于这三张表展开,从信号的产生,检测,到处理来逐步剖析
2022-11-15 19:04:58 480
原创 Linux系统中的管道通信
管道,是Linux下常用的进程间通信手段,具体的通信方法是 父进程打开管道文件,被子进程继承,通过文件描述符fd,并且,数据在管道文件中的读写是彻底的内存级别的,即不与磁盘交互,读和写皆是在内存中,效率也有一定的保证。以上三点机制,使得管道能像文件一样操作的同时,避同时免了使用普通文件进程间通信的 极度的 不安全性。需要注意的是,文件名只是用来标识唯一性,数据的传输更匿名管道一样,完全是内存级的。2.往管道中写入数据时,如果管道满了,或正在被读取,执行写入的进程会阻塞等待。
2022-11-06 15:57:41 1803
原创 Linux下C/C++动静态库
库就是方法们编译为二进制码后整合在一起。供程序链接。根据链接方式的不同又区分为动态库和静态库。它们的使用规则也个不相同。
2022-11-02 14:29:28 914
原创 C++ 继承
inheritance)机制是面向对象程序设计的最重要的手段,它允许程序员在保持原有类特性的基础上进行扩展,增加功能,这样产生新的类,称派生类。继承,体现了由简单到复杂的认知过程。以前我们接触的复用都是函数复用。.........
2022-07-23 16:12:51 1526 1
原创 C++引用的深解析
什么是引用所谓变量,其实是内存地址的一个抽像名字罢了,引用类型就是为一个变量创建一个别名。使得一个块地址空间可以有多个名字。好比关羽,关云长,关二爷,都是说的一个人。例有以下代码:#include<iostream>using namespace std;int main() { int a = 10; int& b = a;//b为a的别名。 cout << "a is " << a << endl << "b i
2022-05-11 12:26:38 233
原创 内联函数(Inline Function )
内联函数是给编译器的提议,在编译成汇编代码时,直接将函数的代码语句在调用处展开,用于优化程序的运行效率。若函数体代码过长或因其他原因不适合内联,编译器可能不接受内联提议,按照普通的函数规则编译。
2022-05-10 12:32:25 4422 1
原创 快速排序(分析,实现以及优化)
快排的排序思想快速排序的核心思路是 在待排区间(l,r)中选中一个关键元素(key),将他排到升序中应待的位置,过程中也使得它左边的元素都小于它,右边的都大于他。这样一次就称为单趟排序,经过一次单趟排序后待排区间就被缩小为了(l,key-1)和(key+1,r)。
2022-04-28 11:09:37 1179
原创 C语言实现堆排序
堆是一种特殊的二叉树数据结构,分为大根堆与小根堆,大根堆即二叉树即其子树都满足:根节点的值大于子树根节点的值。小根堆则相反。堆排序就是利用堆的性质将数据排序。
2022-04-18 12:46:54 1536 1
原创 C语言实现数据结构数组栈
栈是一种特殊的线性表,必须满足"LIFO"(last in fast out),也就是后进先出的原则, 类似于手枪弹夹,只能在栈顶添加或删除数据,用C语言中结构体和数组模拟实现的栈结构,能完成栈的各种操作,就称为 数组栈。
2022-03-25 16:01:36 2103
原创 C语言 文件操作函数fopen解析
1.fopen的原型FILE *fopen(const char *filename, const char *mode);2.返回值fopen 返回指向打开文件的文件指针,若出错则返回NULL(空指针)。3.参数其两个参数均为字符串。第一个参数第一个参数为打开文件的文件名,文件名由 路径+主文件名+扩展名组成例如 H:\文档\Visual Studio 2019\C-program\test_2_22.txt第二个参数第二个参数为打开模式具体如图要注
2022-02-22 19:19:02 9637
原创 C语言结构体内数组成员与指针成员有何区别?
结构体中的数组成员的数组名和指向数组首元素的指针能划等号吗?数组名的值是多少?数组名和指针的区别到底是什么?
2022-01-24 16:18:11 2175 1
原创 C语言实现 扫雷游戏 | 简单项目
要写一个扫雷游戏,由于体量较大,我们打算分三个.c文件(源文件)来定义函数,实现代码,两个 .h 文件(头文件) 来实现我们.c文件中函数的声明和库函数头文件的引用。三个 源文件 : test.c , game.c , print.c两个头文件:game.h , print.htest.c 游戏主题框架 #define _CRT_SECURE_NO_WARNINGS 1#include "game.h"//这里引上我们编写好的头文件#include"print...
2021-12-03 11:29:31 3966
原创 字符类型 char 的值域
char 类型在内存中一个字节 8个比特位按有无符号位 分为 signed char 和 unsigned char要探讨他们的值域 我们一个一个来看:>signed char 类型组成:1符号位 + 7 有效位、符号位 1 2 3 4 5 6 7 我们知道 七个二进制1的值:127容易得出signed char的最大值就 1271 0 0 0 0 0 0 ...
2021-11-28 16:33:05 1907
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人