CyberRt源码分析-无锁哈希表
1. 源码源码目录:cyber/base/atomic_hash_map.h
/** * @brief A implementation of lock-free fixed size hash map * * @tparam K Type of key, must be integral * @tparam V Type of value * @tparam 128 Size of hash table * @tparam 0 Type traits, use for checking types of key & value */template <typename K, typename V, std::size_t TableSize = 128, typename std::enable_if<std::is_integral<K>::value && (TableSize & (TableSize - 1)) == 0, ...
CyberRt源码分析-线程池
1. 源码在cyber/base/thread_pool.h中实现了一个线程池的类,写得很高级,我们来分析一下,代码如下:
class ThreadPool { public: explicit ThreadPool(std::size_t thread_num, std::size_t max_task_num = 1000); template <typename F, typename... Args> auto Enqueue(F&& f, Args&&... args) -> std::future<typename std::result_of<F(Args...)>::type>; ~ThreadPool(); private: std::vector<std::thread> workers_; BoundedQueue<std::function<void()>> task_queue_; std::atomic_bool s ...
CyberRt源码分析-原子读写锁
1. 源码在cyber/base/atomic_rw_lock.h中实现了一个读写锁,代码如下:
class AtomicRWLock { friend class ReadLockGuard<AtomicRWLock>; friend class WriteLockGuard<AtomicRWLock>; public: static const int32_t RW_LOCK_FREE = 0; static const int32_t WRITE_EXCLUSIVE = -1; static const uint32_t MAX_RETRY_TIMES = 5; AtomicRWLock() {} explicit AtomicRWLock(bool write_first) : write_first_(write_first) {} private: // all these function only can used by ReadLockGuard/WriteLockGuard; ...
CyberRt源码剖析-有界无锁队列
1.源码在cyber/base/bounded_queue.h中实现了一个有界无锁队列的模板类,通过c++提供的原子操作来确保线程安全,代码如下:
template <typename T>class BoundedQueue { public: using value_type = T; using size_type = uint64_t; public: BoundedQueue() {} BoundedQueue& operator=(const BoundedQueue& other) = delete; BoundedQueue(const BoundedQueue& other) = delete; ~BoundedQueue(); bool Init(uint64_t size); bool Init(uint64_t size, WaitStrategy* strategy); bool Enqueue(const T& element); bool Enqueue(T&am ...
CyberRt源码剖析-无界无锁队列
1.源码在cyber/base/unbounded_queue.h中实现了一个无界无锁队列的模板类,通过c++提供的原子操作来确保线程安全,代码如下:
template <typename T>class UnboundedQueue { public: UnboundedQueue() { Reset(); } UnboundedQueue& operator=(const UnboundedQueue& other) = delete; UnboundedQueue(const UnboundedQueue& other) = delete; ~UnboundedQueue() { Destroy(); } void Clear() { Destroy(); Reset(); } void Enqueue(const T& element) { auto node = new Node(); node->data = ...
CyberRt源码剖析-线程等待策略
1.线程等待策略在base/wait_strategy.h这个头文件中定义了线程切换的策略类:
class WaitStrategy { public: virtual void NotifyOne() {} virtual void BreakAllWait() {} virtual bool EmptyWait() = 0; virtual ~WaitStrategy() {}};class BlockWaitStrategy : public WaitStrategy { public: BlockWaitStrategy() {} void NotifyOne() override { cv_.notify_one(); } bool EmptyWait() override { std::unique_lock<std::mutex> lock(mutex_); cv_.wait(lock); ...
CyberRt源码剖析-常用宏分析
从这篇blog开始,我们来分析百度CyberRt这个高性能的分布式通信中间件
CyberRt的源码组成如下:
base文件夹是Apollo开发的高性能基础库,我们先从这个文件夹里的代码看起:
从文件命名中可以看见实现了与线程相关的如线程池、锁、无锁队列、哈希表等等基础组件,我们就开始从零造轮子吧
1.c++前置知识std::nothrow(std::nothrow) 是在C++中用于进行内存分配时的一种选项。通常,当你使用 new 运算符创建对象时,如果内存分配失败,new 会抛出 std::bad_alloc 异常。但是,当你希望在分配失败时不抛出异常,而是返回一个空指针,你可以使用 (std::nothrow) 作为参数传递给 new。
具体来说,使用 (std::nothrow) 会使得 new 在分配失败时返回一个空指针而不是抛出异常。这样,你可以在分配失败时通过检查返回的指针是否为空来处理错误,而不必使用异常处理机制。
以下是一个示例:
#include <iostream>int main() { // 尝试分配一个非常大的数组,可能导致 ...
riscv编译工具链构建说明
riscv编译工具链构建说明构建riscv-gnu-toolchain有几种方式:
第一种是直接下载源码然后本地编译,然后 make install
第二种如果使用的是ubuntu20,可以直接使用 apt 安装
第三种就是下载别人已经编译好的文件,然后解压,配置一下工具链路径
编译器有这几种类型,以64位的编译器为例子,三种不同类型编译器的区别后面会说明
riscv64-linux-gnu-gcc
riscv64-unknown-elf-gcc
riscv64-unknown-linux-gnu-gcc
源码构建riscv-gnu-toolchain的官方仓库在:riscv-collab/riscv-gnu-toolchain: GNU toolchain for RISC-V, including GCC (github.com),下载上面的源码,然后按照官方提供的编译命令进行编译安装,但是绝大多数时候是编译不过的,因为官方的源码依赖种的第三方文件我们下载不下来,有一个解决办法就是去gittee镜像上去把对应的包下载然后放进源码种,这样编译是能成功。关于如何在gi ...
手写STL之List
代码仓库:yanglianoo/My_STL at timer (github.com)
1.List概述C++标准模板库(STL)中的list是一个双向链表容器,提供了在链表中高效存储和访问数据的功能。它是一个模板类具有以下特性:
链表结构:list是由节点组成的链表,每个节点包含数据以及指向前一个节点和后一个节点的指针。这种结构使得在list中插入、删除和移动元素非常高效,因为不需要像动态数组那样进行内存的移动和重分配。
双向访问:list支持双向访问,可以从链表的开头或末尾快速访问元素。你可以使用迭代器进行正向或反向遍历,也可以使用front()和back()函数访问第一个和最后一个元素。
动态大小:list的大小可以动态增长或缩小,无需预先分配固定大小的内存。
插入和删除:在list中插入和删除元素非常高效。通过使用迭代器,可以在常数时间内在任意位置插入或删除元素。
不支持随机访问:list不支持通过索引进行随机访问,这意味着不能像数组那样使用索引来访问元素。如果需要随机访问,vector可能更适合。
没有连续存储:由于list是一个链表,它的元素在内存中不是连 ...
计算机系统基础-存储访问
1.存储器使用场景先来看如下这一张图,CPU运行程序的流程如下:
1:假设我现在在电脑上编译了一个hello.c的程序,编译完成后为hello.bin的一个二进制文件,此时这个程序还存储在我们电脑的硬盘上,这个硬盘可能是机械硬盘也可能是固态硬盘,这些都是外存储器。
2:将hello.bin装载进内存,这里的内存就是插在电脑上的内存条,hello.bin包含了cpu要执行的指令和运行所需要的数据。
3:CPU从内存中逐条读取指令及相关指令,然后依次执行完成对数据的处理。
4:将处理结果送回内存保存,然后再将处理结果送到外存储器。
所以其实在CPU运行的过程中主要是分为两类存储器:
内存储器
存取速度快
成本高、容量相对较小
直接与CPU连接,CPU对内存 中可直接进行读、写操作
属于易失性存储器(volatile), 用于临时存放正在运行的程序和数据,掉电就没了数据。
外存储器(简称外存或辅存)
– 存取速度慢 – 成本低、容量很大
– 不与CPU直接连接,先传送到内 存,然后才能被CPU使用。
– 属于非易失性存储器,用于长久存放系统中几乎所有的信息
这里可能会有 ...









![ARM64-Trust-Firmware[3]-BL1解析](/2026/01/24/ARM64-Trust-Firmware-3-BL1%E8%A7%A3%E6%9E%90/17692290470595.png)
![ARM64-Trust-Firmware[2]-启动ATF](/2026/01/24/ARM64-Trust-Firmware-2-%E5%90%AF%E5%8A%A8ATF/17692287555201.png)
![ARM64-Trust-Firmware[1]-ARM安全架构](/2026/01/24/ARM64-Trust-Firmware-1-ARM%E5%AE%89%E5%85%A8%E6%9E%B6%E6%9E%84/17692284856153.png)
![Xhyper剖析[6]--中断虚拟化](/2026/01/20/Xhyper%E5%89%96%E6%9E%90-6-%E4%B8%AD%E6%96%AD%E8%99%9A%E6%8B%9F%E5%8C%96/17689244713913.png)
![Xhyper剖析[5]--MMIO虚拟化](/2026/01/20/Xhyper%E5%89%96%E6%9E%90-5-MMIO%E8%99%9A%E6%8B%9F%E5%8C%96/17689243819381.png)