qidao123.com技术社区-IT企服评测·应用市场

标题: 【中心件】brpc之工作窃取队列 [打印本页]

作者: 欢乐狗    时间: 前天 14:33
标题: 【中心件】brpc之工作窃取队列
BRPC Work Stealing Queue

1 核心功能

无锁工作窃取队列(Lock-Free Work Stealing Queue),用于在 BRPC 的 bthread 用户态线程库中支持高效的任务调理。
设计目的:


2 关键数据布局

2.1 队列布局

  1. template <typename T>
  2. class WorkStealingQueue {
  3. private:
  4.     std::atomic<size_t> _bottom;  // 本地线程操作的队尾
  5.     std::atomic<size_t> _top;     // 其他线程窃取的队头
  6.     T* _array;                    // 环形缓冲区
  7.     size_t _capacity;             // 队列容量
  8. };
复制代码

2.2 内存布局优化



3 核心操作

3.1 本地线程操作(非线程安全)


3.2 窃取操作(线程安全)



4 设计亮点

4.1 无锁原子操作


4.2 环形缓冲区优化


4.3 线程角色分离



5 性能优化



6 应用场景



7 潜在问题与改进

7.1 ABA 问题


7.2 容量限定


7.3 伪共享



8 代码示例(简化版)

  1. template <typename T>
  2. class WorkStealingQueue {
  3. public:
  4.     WorkStealingQueue(size_t capacity) :
  5.         _bottom(0), _top(0), _capacity(next_pow2(capacity)) {
  6.         _array = new T[_capacity];
  7.     }
  8.     bool push(T item) {
  9.         size_t b = _bottom.load(std::memory_order_relaxed);
  10.         if (b - _top.load(std::memory_order_acquire) >= _capacity)
  11.             return false;
  12.         _array[b & (_capacity - 1)] = item;
  13.         _bottom.store(b + 1, std::memory_order_release);
  14.         return true;
  15.     }
  16.     bool steal(T* item) {
  17.         size_t t = _top.load(std::memory_order_acquire);
  18.         size_t b = _bottom.load(std::memory_order_acquire);
  19.         if (t >= b) return false;
  20.         *item = _array[t & (_capacity - 1)];
  21.         return _top.compare_exchange_strong(t, t + 1,
  22.                    std::memory_order_seq_cst,
  23.                    std::memory_order_relaxed);
  24.     }
  25. };
复制代码

9 总结

work_stealing_queue.h 是 BRPC 高性能任务调理的核心组件,通过无锁环形缓冲区和原子操作实现高效的任务存取与窃取。其设计充分优化了本地线程操作的性能,同时通过精致的内存序控制包管窃取操作的线程安全。实用于高并发场景下的负载均衡,但需注意容量限定和 ABA 问题的潜在风险。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。




欢迎光临 qidao123.com技术社区-IT企服评测·应用市场 (https://dis.qidao123.com/) Powered by Discuz! X3.4