Sutdown Blog

「我相信我的命运因我的选择而转动着」

Debug-死锁和TLS连接

共享锁和独占锁的互斥 terminate called after throwing an instance of ‘std::system_error’ what(): Resource deadlock avoided Aborted (core dumped)(死锁导致中止) 解决: gdb定位 idle中发生死锁 IOManager::idle(),run in t...

协程详解

协程详解 前言 最近在学协程库,因为计划是12月底之前,时间有限想着直接从代码起步,果然这样子还是不好的,这几天很多东西处于一种似懂非懂的状态,很难受。所以决定写篇文章重新捋一下,之前也写过一点点,但是太浅了。 主要参考有没有C++大佬把C++20的协程讲解下? - 知乎这个问题中南山烟雨珠江潮 - 知乎的回答,以及代码随想录的协程库源码。 正文 进程线程协程 进程,线程,...

详谈leveldb中的sstable

惊讶的发现我之前看leveldb的时候没怎么仔细看这一部分),估计是看到后面懒了,现在补补。 先讲讲sstable在·leveldb·中的位置 (sstable全名Sorted String Table) 在leveldb中,当将memory db的数据持久化文件中时,leveldb会以一定的规则进行文件组织,文件格式变为sstable。 查询时,一般会通过footer先在meta ...

c++多线程

略有点烦躁,看到一篇讲c++多线程的文章,感觉还不错,大致的看看这部分。 这篇写的有点潦草,之后再补充吧。 前言 看到多线程其实容易想到多进程,还有几讲出现在标准库的协程,协程这块了解不多,大致是对线程之间更加细化的分配,深入学习的话可以看看网上的文章,或者腾讯的libco源码,这是我的打算,不过目前还没看。 回到正题,多线程和多进程的多任务处理都是一种并发执行。 多进...

leveldb源码阅读8 Orient面试

介绍一下这个项目(分模块) 本项目主要参考Google开源项目levelDB,实现了一个基于LSM结构的键值存储引擎。 项目中实现了日志、布隆过滤器、内存分配器、缓存管理、文件读写、SSTable存储、写前日志(WAL),MemTable管理等核心模块,对各模块进行了单元测试。用键值对存储,支持快速写入和高效查询,具备良好的稳定性和性能。 项目介绍: 本项目主要基于log s...

leveldb源码阅读7 Question

https://segmentfault.com/a/1190000009707717# 我喜欢这篇文章,写的很有意思。 1.讲讲leveldb是什么 LevelDB是Google开源的持久化KV单机数据库,特点在于使用键值对存储,支持快速随机读写,大容量存储操作。它使用LSM树结构,优化了写入性能,同时支持compaction以减少存储空间。但是LSM树的核心思想在于放弃部分读的性能换...

C++演化(论文现代C++白皮书,书籍深入理解C++11特性)

本文分为两部分: 现代c++白皮书:在纷繁多变的世界里茁壮成长:C++ 2006–2020论文笔记 书籍:深入理解c++11特性阅读笔记 找资料的过程中发现了现代c++白皮书,相见恨晚,github上还有各路大佬翻译的中文版,论文和《深入理解c++11》刚好可以同步学习,c++11应该属于现代版c++的开端,到了c++20,版本迭代属于更加完善了。 ...

leveldb源码阅读6 wirte&read and log

LOG log结构和设计 Log有Record和一些为了对其而填充的gap组成的文件。levelDB在读取Log文件时,为了减少IO次数,每次读取都会读入一个32KB大小的块。因此在写入log文件时,leveldb也将数据按照32KB对齐。 每个块中会很有多段,段的记录形式有三种:FirstType Middle Fragment Last Fragment。 而对于段结构: ...

赋值运算符函数

赋值运算符函数 1 2 3 4 5 6 7 8 9 10 11 class CMyString { public: CMyString(char* pData = NULL); CMyString(const CMyString& str); ~CMyString(void); CMyString& operator =(const CMyString &...

单例模式

顾名思义,单例模式就是只提供一个类的实例。 简单来说的需要思考到的要点有: 全局只存在一个实例,不能拷贝和赋值 有实例时直接返回该实例,没有实例时创建实例 创建实例考虑线程安全 双重锁校验 两次锁的出现其实都是为了确保线程安全, 只有确保实例为空时,我们才需要加锁创立新的实例, 加完第一次锁之后,可能其它线程已经创建实例,此时需要再次进行判断,判断为空后就可以创建...