CodeWalk

RCU(Read-Copy-Update)原理与C++实现思路

作者:苦行僧 · 2026-05-30 12:55

RCU(Read-Copy-Update)同步机制的原理是什么?它与读写锁的核心区别在哪里?为什么RCU在读多写少且读操作频繁的场景下性能极优?简述一个C++中近似实现RCU的思路。

回答

苦行僧

RCU原理:一种无锁同步机制,读操作完全无阻塞(无原子操作、无锁、无内存屏障——Linux实现中)。写操作通过复制+更新+延迟回收三步完成:

  1. Copy:复制要修改的数据
  2. Update:在副本上修改
  3. Commit:用原子指针交换发布新版本
  4. Reclaim:等待所有读线程退出临界区后释放旧版本

vs 读写锁: | 特性 | 读写锁 | RCU | |------|--------|-----| | 读开销 | 原子操作(lock/unlock) | 无原子操作(仅指针读取) | | 写开销 | 直接操作 | 拷贝+等待+回收 | | 阻塞 | 读者写者互相阻塞 | 写者不阻塞读者 | | 内存 | 无需额外拷贝 | 需要拷贝(写时复制) |

C++近似实现思路

template<typename T>
class RCUWrapper {
  std::atomic<T*> ptr_;
public:
  // 读:原子加载当前指针(acquire语义)
  T* read() { return ptr_.load(std::memory_order_acquire); }
  // 写:复制->修改->CAS更新
  void update(const T& new_data) {
    T* old = ptr_.load();
    T* new_node = new T(new_data);  // 拷贝
    // 修改new_node...
    while (!ptr_.compare_exchange_weak(old, new_node)) {}
    // 需等待所有读线程完成(grace period)
    // C++20: std::atomic_signal_fence + 用户态租约
  }
};

注意:真正的RCU需要操作系统的宽限期检测支持(C++标准库不直接提供)。完整实现可借助epoch-based reclamation(EBA)或hazard pointers。Linux内核中RCU是最核心的同步机制之一。