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 · 682 阅读 · 0 评论 -
Brpc源码浅析(三)C++11 原子操作 内存模型 内存屏障
关于C++11原子操作相关的知识,着实有点晦涩难懂,但这又是看懂Brpc源码必备的知识点之一。在网上查找了很多前人关于这块的解读文章,不同文章之间的解读确有些许出入。本文仅对自己了解和认可的部分做解释和梳理,形成自己的理解。日后发现有错误不足的地方,再做修正补充。一. 原子性,可见性,内存序的区分我们以一个最简单的语句x.store(1, memory_order_relaxed);为例,这条...原创 2020-03-08 19:39:11 · 1122 阅读 · 0 评论 -
Brpc源码浅析(二)无锁双缓存实现
源码与官方文档路径doubly_buffered_data.h(420行代码)lalb.md适用场景适用于读多写少的场景,并且写不需要休眠去等待,能够支持实时的写。同时读之间没有竞争,将读的竞争尽可能转移到写上实现原理数据分前台和后台。读拿到自己所在线程的thread-local锁,执行查询逻辑后释放锁。同时只有一个写:修改后台数据,切换前后台,挨个获得所有thread-loca...原创 2020-03-01 17:18:22 · 826 阅读 · 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 · 2780 阅读 · 0 评论