- 博客(40)
- 收藏
- 关注
原创 跳表的学习记录
关闭并移除: 一旦找到,你就关闭店铺,并且移除所有通向这家店铺的楼梯和电梯的指示标志。这在跳表中对应于移除一个节点,并更新所有指向该节点的指针,确保它们指向下一个正确的节点。开设店铺: 一旦找到位置,你就在那里开设你的店铺,并确保楼梯或电梯可以通到你的店铺。调整楼层: 如果你关闭的是最高层的唯一店铺,那么整个楼层可能会被关闭。这就像在跳表中,如果删除节点后某一层没有任何节点了,我们就降低跳表的高度。put 操作就像是在购物中心里找一个合适的位置来开设你的店铺。现在,想象你决定关闭你在购物中心的某个店铺。
2023-11-26 15:33:36
255
原创 redis分布式锁的学习记录
问题 :倘若 使用方 A 在 redis master 节点加锁成功,但是对应的 kv 记录在同步到 slave 之前,master 节点就宕机了. 此时未同步到这项数据的 slave 节点升为 master,这样分布式锁被 A 持有的“凭证” 就这样凭空消失了. 于是不知情的使用方 B C D 都可能加锁成功,于是就出现了一把锁被多方同时持有的问题,导致分布式锁最基本的独占性遭到破坏.解决方案:在锁的持有方未完成业务逻辑的处理时,会持续对分布式锁的过期阈值进行延期操作.把从存储介质中删除类比成解锁动作。
2023-11-19 14:42:16
244
原创 protobuf---编码原理
Protocol Buffer 利用 Varint 原理压缩数据,同时使用Tag - Value (Tag - Length - Value)的编码结构的实现,减少了分隔符的使用,数据存储更加紧凑。protocol buffers 在序列化方面,与 XML 相比,有诸多优点:更加简单数据体积小 3- 10 倍更快的反序列化速度,提高 20 - 100 倍可以自动化生成更易于编码方式使用的数据访问类```
2023-11-16 14:58:42
288
原创 resp协议
Redis 的客户端和服务端之间采取了一种名为 RESP(REdis Serialization Protocol) 的协议,进行通信。
2023-11-15 15:47:54
413
原创 RPC学习
rpc到底干了什么,rpc怎么干的RPC 的全称是 Remote Procedure Call,即远程过程调用。简单解读字面上的意思,远程肯定是指要跨机器而非本机或者是同一机器不同进程之间调用,所以需要用到网络编程才能实现。作用。
2023-04-21 17:45:48
784
原创 RAII技术学习
RAII中的R代表资源,计算机中的一切可由程序员管理的,如指针的申请的内存,开启占用的文件描述符,创建与销毁的锁等等对于资源的一般操作即就是申请使用释放为了避免一些人为与非人为的因素造成资源的未释放或者是未初始化的野指针的问题,如没有delte的内存,没有unlock的锁,所诞生出的技术。...............
2022-07-20 11:57:27
509
3
原创 二叉搜索树
也称为排序二叉树(sortedbinarytree),是指一棵空树或者具有下列性质的二叉树若任意节点的左子树不空,则左子树上所有节点的值均小于它的根节点的值;若任意节点的右子树不空,则右子树上所有节点的值均大于它的根节点的值;任意节点的左、右子树也分别为二叉查找树;特点左子树上的所有节点的值小于根节点值右子树上的所有节点的值大于根节点值。...
2022-07-16 15:15:00
182
原创 线程池的学习记录
1.对于一个线程池来说主体应大致由三部分组成2.模块分析1.main()2.pthreadpool_create()3.pthread_destory对于关闭属性参数置为1回收管理管理者线程唤醒阻塞的消费者线程,让其进行自杀释放堆内存,销毁锁变量释放线程池结构体指针4.pthread_add向任务队列中加入任务5.threadeixt让不符合条件的线程退出剩下的部分可以需要再创建或者细分线程池结构体创始化向线程池中加入任务执行任务的函数void* w
2022-06-09 14:45:00
263
1
原创 多路io复用
multiple io transfer --select这种方式可以同时监测多个文件描述符并且这个过程是阻塞的,一旦检测到有文件描述符就绪( 可以读数据或者可以写数据)程序的阻塞就会被解除,之后就可以基于这些(一个或多个)就绪的文件描述符进行通信了select委托内核帮助我们检测若干个文件描述符的状态#include <sys/select.h>struct timeval { time_t tv_sec; /* seconds */
2022-05-30 18:45:38
142
1
原创 linux网络编程
socketsocke初识大小段字节序转换ip转换函数socketbindlisten - listen for connections on a socketaccept-accept a connection on a socketconnect-initiate a connection on a socketsocke初识因为linux的一切皆文件的思想,所以对于网络编程来说同样也是利用一系列的网络函数对于文件进行交互修改大小段字节序转换因为一些历史原因,本地机器一般通常用的都是小端模
2022-05-29 16:45:00
149
3
原创 函数对象(仿函数)
函数对象函数对象(仿函数)谓词一元谓词二元谓词函数对象(仿函数)函数对象在使用时可以向普通函数那样调用,可以有参数,可以有返回值函数对象可以超出普通函数的概念,函数对象可以有自己的状态函数对象可以作为参数传递class myadd{public: int operator()(int v1,int v2) //对函数调用符重载 { return v1+v2; }};函数对象在使用时,可以向普通函数一样调用void test01(){ m
2022-05-23 08:30:00
141
原创 类模板的学习
函数模板一种实现泛型编程的方法template < typename T >函数的声明或定义template --声明模板 typename–数据类型 可以用classs替换在声明好的模板紧跟函数即可template<class T>void myswap(T& a, T& b){ T temp = a; a = b; b = temp;}使用方式为自动类型推导与显示指定类型myswap(a, b); //myswap<int
2022-05-16 09:30:00
123
3
原创 哲学家进餐问题
哲学家进餐问题引言互斥锁加锁不得打断奇偶分割线程利用信号量实现伪锁引言有五个哲学家绕着圆桌坐,每个哲学家面前有一盘面,两人之间有一支筷子,这样每个哲学家左右各有一支筷子。哲学家有2个状态,思考或者拿起筷子吃饭。如果哲学家拿到一只筷子,不能吃饭,直到拿到2只才能吃饭,并且一次只能拿起身边的一支筷子。一旦拿起便不会放下筷子直到把饭吃完,此时才把这双筷子放回原处。如果,很不幸地,每个哲学家拿起他或她左边的筷子,那么就没有人可以吃到饭了。哲学家就餐问题是经典的多线程并发争抢资源的问题,5个人抢5根筷子(外
2022-05-10 08:45:00
611
2
原创 线程同步的几种方式
线程同步的几种方式线程同步的几种方式互斥锁条件变量信号量读写锁线程同步的几种方式互斥锁使用互斥量完成对临界区的资源的加锁操作,使得同一时刻,对一个共享数据的使用只能又一个线程完成例向屏幕上一次打印abcd四个字母可以使用的是一个类似锁连的思想 a 加完解开后拿b锁依次类推#define THRNUM 4static pthread_mutex_t mut[4];static int next(int n){ if(n + 1 == THRNUM) return 0;
2022-05-07 08:45:00
375
3
原创 互斥量的学习
线程的主要优势在于,能够通过全局变量来共享信息。不过,这种便捷的共享是有代价的:必须确保多个线程不会同时修改同一变量,或者某一线程不会读取正由其他线程修改的变量。为了防止出现线程某甲试图访 问一共享变量时,线程某乙正在对其进行修改。引入了互斥量互斥量 (保护对共享变量的访问)1.概念为避免线程更新共享变量时所出现问题,必须使用互斥量( mutex 是 mutual exclusion 的缩写)来确保同时仅有一个线程可以访问某项共享资源。即就是 使用互斥量来实现原子访问操作2.状态已.
2022-04-28 10:15:00
399
4
原创 线程的初识
线程初识线程的概念线程的创建线程的概念可以简单理解为一个正在独立运行的函数注: 1,posix线程是一套标准吗,而不是实现2.线程标识: phread_t,可能是整形也可能是结构体指针等*简单介绍关于线程标识的函数* *pthread_equarl() ;判断两个线程标识是否相等**pthread_self();返回自身的线程标识* 线程的创建pthread_creat();int pthread_create(pthread_t *restrict tidp, //新
2022-04-27 09:30:00
182
原创 信号的简单了解
@[TOC]信号信号信号是一种软件中断的机制的体现关于中断简单理解 中断指计算机CPU获知某些事,暂停正在执行的程序,转而去执行处理该事件的程序,当这段程序执行完毕后再继续执行之前的程序。整个过程称为中断处理,简称中断信号在内核中的表示信号递达(Delivery):实际执行信号处理的动作信号未决(Pending):信号从产生到递达之间的状态信号阻塞(Block):被阻塞的信号产生时将保持在未决状态,直到进程解除对此信号的阻塞,才执行递达动作。注: 1.信号的阻塞和信号的忽略是不
2022-04-22 19:13:33
225
原创 ipc 进程间通信
文章目录IPC方法一,管道pip函数总结二,fifo文件间进程通信IPC方法Linux环境下,进程地址空间相互独立,每个进程各自有不同的用户地址空间。任何一个进程的全局变量在另一个进程中都看不到,所以进程和进程之间不能相互访问,要交换数据必须通过内核,在内核中开辟一块缓冲区,进程1把数据从用户空间拷到内核缓冲区,进程2再从内核缓冲区把数据读走,内核提供的这种机制称为进程间通信(IPC,InterProcess Communication)。进程间通信间① 管道 (使用最简单)② 信号 (
2022-04-18 20:13:29
250
原创 shell初识
shell交互式解释和执行用户输入的命令或者自动地解释和执行预先设定好的一连串的命令, 也就是一个可以将用户发出的操作命令解释给操作系统的一个应用程序一,shell常用的通配符通配符 含义 实例 * 匹配 0 或多个字符 a*b,a与b之间可以有任意长度的任意字符, 也可以一个也没有, 如 aabcb, axyzb, a012b, ab ? 匹配任意单个字符 a?b,a与b之间有且只有一个字符, 可以是任意字符, ...
2022-03-30 17:21:47
1927
2
原创 类中的不同成员特性
类对象作为类成员c++类中的成员可以是另一个类的对象,我们 称成员为 对象成员例如class A{}class B{ A a;}当其他类对象作为本类成员时,构造时候先构造类对象析构的顺序与之相反先有子体,组成母体,母体释放,子体解脱## 静态成员在成员变量和成员函数之前加上关键字static,被称为静态成员静态成员变量1.所有对象共享同一份数据2.在编译阶段分配内存3.类内声明,类外初始化class person(){public:
2022-03-15 21:34:12
1027
原创 构造函数和析造函数特点
构造函数的调用默认情况下编译器至少给一个类添加3个函数1.默认构造函数(无参,函数体实现)--完成对象的初始化2.默认析构函数(无参,函数体为空)--完成对象的清理3.默认拷贝构造函数,属性进行值拷贝规则:如果用户定义了有参构造,c++不会提供无参构造,但是提供默认拷贝构造如果用户定义了拷贝构造函数,c++不会在提供其他函数 类名(){}构造函数的语法,1,没有返回值,也不写void;2,函数名称与类名相同;3,构造函数可以有参数,因此可以发...
2022-03-15 17:14:39
1852
1
原创 c++补充基础
一.命名空间定义以及使用 在c++中为了避免在大规模程序设计中,以及使用库时各种大量命名冲突,标准c++引入了关键字namespace,可以更好的控制标识符的作用域。对与变量a若是要使用须如上引用两次才可总结1.当使用<iostream>的时候,该头文件没有定义全局命名空间,必须使用 namespace std,这样才能正确使用cout。若不引入 namespa std,需要这样做 std::cout;2. c++标准为了和c区别开,规定头文件...
2022-03-14 21:45:39
129
原创 Linux中vscode中c的配置
cpp{ "configurations": [ { "name": "Linux", "includePath": [ "${workspaceFolder}/**" ], "defines": [], "compilerPath": "/usr/bin/gcc", "cStandard": "gnu11", "cpp
2022-01-04 15:57:16
592
原创 啊没错这是队列
定义#pragma once# include <stdio.h>#include <stdbool.h># include <stdlib.h># include <assert.h>typedef int qdatatype;typedef struct queuenode{ struct queuenode* next; qdatatype data;}qnode;typedef struct queue{ qno
2022-01-04 00:29:47
264
原创 啊没错这是栈
定义(以动态数组实现)# pragma once# include <stdio.h> #include <stdbool.h># include <stdlib.h># include <assert.h>typedef int stdatatype;typedef struct stack{ stdatatype* a; int top; int capacity;}st;void stackinit(st* ps);
2022-01-04 00:28:57
244
原创 链表简单oj题
LeetCode206 反转链表图形结合方法一翻转三指针法struct ListNode* reverseList(struct ListNode* head){ if(head==NULL) return NULL ; struct ListNode* n1=NULL; struct ListNode *n2=head; struct ListNode*n3=head->next; while(n2!=NULL) {
2022-01-04 00:28:14
271
原创 带头循环链表
顺序表是用一段物理地址连续的存储单元依次存储数据元素的线性结构,一般用数组。对数组完成数据的增删查改顺便表分为:1.静态顺序表:使用定长数组创建;2.动态顺序表:动态创建
2022-01-04 00:27:54
474
原创 西邮Linux19-21兴趣小组面试题
无数unsigned int 的数据范围大小为0~255,无论加减皆为 0~255的快乐循环1 中间变量 2 加减法 3 异或的特殊性 a^b^a=bstaic关键字使得a成为静态变量,被放置在静态区只初始化一次 使得 生命周期变长int b 其实 默认为 auto int ,该变量在栈上,每被调用一次函数初始化一次XiyouLinuxGroup2019printf的返回值为成功打印的字符数-1 0...
2021-12-13 21:57:29
163
原创 Git的基本使用
1.了解git的基本概念2.git的基本工作流程3.git的基础常用命令4熟悉git代码托管服务5.使用idea操作git一.为啥会用到git1.备份(写了好久的代码,突然电脑因为神秘力量硬盘牺牲了,避免代码的丢失)2.代码还原(项目需要实现一个很复杂的功能,改了很久,脑子发热把改的代码面目全非了,不知道原来长什么样)3.协同开发(和小伙伴一起方便维护)4.追溯问题代码的编写人和编写时间(这波是究极甩锅局)二..版本控制器的方式1.集中式版本...
2021-12-05 16:42:30
180
原创 大整数加法
对于处理较大整数范围的数据时,会超出数据类型的存储范围造成数据溢出,所以对于大整数的运算我们借用的 竖式计算的思想 去实现例如 计算 12345+ 123456789的和在输入数字是可以采用使用字符串的输入形式,倒着计算每一位的和,当要进位时,在本位利用取余操作存到下一次加法过程中输入与存储# include <stdio.h># include <string.h># define MAXLEN 210 //改变位数int ...
2021-12-01 17:45:30
305
原创 动态内存开辟
目录内存的使用方式1.malloc2. relloc3.free常见的问题动态内存函数头文件为 stdlib.h内存的使用方式栈区 : 局部变量 ,函数的形式参数,创建一个数组(非全局变量)堆区: 动态内存分配静态区 : 全局变量,静态变量,staic int a=10;1.mallocC 库函数void *malloc(size_t size)分配所需的内存空间,并返回一个指向它的指针。void *malloc(size_t size)...
2021-11-30 20:40:44
126
原创 结构(枚举与联合)体
一.结构体的声明struct tag (结构体类型名){member-list;} s1;(一定要注意结果的分号)此处的结构体类型名为tag 而 s1 所创建的是类型为tag的变量二.结构体的成员类型可以是整形,浮点型,数组,指针,或者是结构体三.结构体的定义和初始化struct Book{ char name[20];//书名 int number[4];//价格}b1={"zhangsan",40}; // 第一种是直接跟在后面..
2021-11-30 20:40:32
112
原创 c语言中数据的存储2.0之浮点数的存储形式
浮点型在内存中的存储int n=9; float* pfloat=(float*)&n; printf("n的值为%d\n",n); printf("n的值为%f\n",*pfloat); * pfloat= 9.0; printf("n的值为 %d \n",n); printf("* pfloat的值为:%f",* pfloat);n的值为9n的值为0.000000n的值为 1091567616 * pfloat的值为:9.000000.
2021-11-23 09:00:00
699
1
原创 C语言中数据的存储1.0
文章目录目录前言一、类型归类 2、浮点型家族3、构造类型(后面再作探讨)3、指针类型4、空类型void 表示空类型(无类型)二、类型的意义1.占据的内存大小2.作为数据时所操作的大小(即为数据看待类型的视角)三、数据在类型中存储(以整形和浮点型为例子)前言关于C语言中的一、类型归类 对于基本的c语言数据类型的基本归类 1、整形家族char (内存存储的为ascall码值,存储为整数) uns...
2021-11-18 21:10:15
760
2
原创 实现strlen的几种方法
int my_strlen(char* str){ int cnt = 0; while (*str != '\0') { cnt++; str++; } return cnt;}运用指针加法移动来找到字符串结束标志,然后返回计数器的值int my_strlen(char* str){ char* strat = str; while (*str != '\0') { str++; } return str-strat;}同类型指针相减返回中间的元..
2021-11-09 20:19:20
268
原创 关于学习中对整形提升的整理
为何要进行整形提升? 通常,表达式要进行整形计算时在CPU的相应计算器内执行,cpu内整形运算器的操作数的字节长度一般为int的字节长度(CPU通用寄存器的程度。 因此,当发生两个char型相加时,cpu需要转换成整形操作数的标准长度。通常cpu难以实现两个为8比特字节直接运算,所以,当出现计算表达式中各种长度小于整形长度,必须进行到int和unsig int的转化。 如何整形提升?char a,b,c;a=b+c; 以char型为例,若进行char型 b与...
2021-11-08 21:41:28
111
1
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅