![](https://img-blog.csdnimg.cn/20201014180756928.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
Brpc源码浅析
对面『胶己人』
This is my note, not my blog
展开
-
Brpc源码浅析(四)WorkStealingQueue类实现
源码路径 work_stealing_queue.h 原理简析 申请一块连续内存数组作为队列,本地工作线程往队列尾部push和pop队列数据,其余竞争线程往队列首部steal队列数据,一首一尾,可以减少竞争。队列使用lock free技术实现 实现 类的数据成员: butil::atomic<size_t> _bottom; //指向队列的尾部 size_t _capa...原创 2020-03-08 22:44:17 · 694 阅读 · 0 评论 -
Brpc源码浅析(三)C++11 原子操作 内存模型 内存屏障
关于C++11原子操作相关的知识,着实有点晦涩难懂,但这又是看懂Brpc源码必备的知识点之一。在网上查找了很多前人关于这块的解读文章,不同文章之间的解读确有些许出入。本文仅对自己了解和认可的部分做解释和梳理,形成自己的理解。日后发现有错误不足的地方,再做修正补充。 一. 原子性,可见性,内存序的区分 我们以一个最简单的语句x.store(1, memory_order_relaxed);为例,这条...原创 2020-03-08 19:39:11 · 1161 阅读 · 0 评论 -
Brpc源码浅析(二)无锁双缓存实现
源码与官方文档路径 doubly_buffered_data.h(420行代码) lalb.md 适用场景 适用于读多写少的场景,并且写不需要休眠去等待,能够支持实时的写。同时读之间没有竞争,将读的竞争尽可能转移到写上 实现原理 数据分前台和后台。 读拿到自己所在线程的thread-local锁,执行查询逻辑后释放锁。 同时只有一个写:修改后台数据,切换前后台,挨个获得所有thread-loca...原创 2020-03-01 17:18:22 · 870 阅读 · 0 评论 -
Brpc源码浅析(一)Flatmap实现
源码与官方文档路径 flat_map.h(486行代码) flat_map_inl.h(657行代码) flatmap.md 原理简析 如图所示,flatmap使用的是开链哈希。使用时先申请一块N*sizeof(Bucket)大小的连续虚拟内存。Bucket本身会存储value值,因此当哈希算法足够优秀时(即不会有拉链或很短的拉链),可以实现接近原生数组的查找性能。 数组大小的选取有两种方式: ...原创 2020-02-29 23:00:53 · 2838 阅读 · 0 评论