Readerwriterqueue 源代码阅读

ReaderWriterQueue 是一个高性能的 C++无锁队列实现,专为单生产者-单消费者(SPSC)场景设计。 无锁设计:完全无锁实现,enqueue 和 dequeue 操作都是 O(1)时间复杂度 高性能:在 x86 架构上,内存屏障编译为无操作指令,性能极佳 C++11 兼容:支持移动语义,减少不必要的拷贝 泛型模板:使用模版支持任意类型的元素,类似 std::queue 内存高效:预分配连续内存块,提供 try_enqueue 保证不分配内存 阻塞版本:提供 BlockingReaderWriterQueue 支持 wait_dequeue 操作 适用于需要在两个线程间高效传递数据的场景,如生产者-消费者模式、异步任务处理等。仅需包含头文件即可使用,无需额外依赖 核心问题 1. 整体思路 代码中主要包含两个部分,一个是队列链表,这个链表中存储很多的 block,每个 block 内部实现又是一个链表,这个链表,有读写两个指针,可以存放多个线程共享的元素 2. 内存中结构 存储的数据分为两部分,一部分是 Block 中属性数据+内存对其 auto size = sizeof(Block) + std::alignment_of<Block>::value - 1; 另一部分则是需要存储的具体数据: size += sizeof(T) * capacity + std::alignment_of<T>::value - 1; 针对申请的内容,实际分配内存进行指针对齐 auto newBlockRaw = static_cast<char *>(std::malloc(size)); auto newBlockAligned = align_for<Block>(newBlockRaw); auto newBlockData = align_for<T>(newBlockAligned + sizeof(Block)); template <typename U> static AE_FORCEINLINE char *align_for(char *ptr) AE_NO_TSAN { const std::size_t alignment = std::alignment_of<U>::value; return ptr + (alignment - (reinterpret_cast<std::uintptr_t>(ptr) % alignment)) % alignment; } 为什么这个过程中需要内存对其,可以看下下面的问题部分,这样对齐之后可以保证: ...

August 11, 2025 · 4 min · 816 words