leveldb AtomicPointer

leveldb AtomicPointer


版权声明:本文为 cheng-zhi 原创文章,可以随意转载,但必须在明确位置注明出处!

AtomicPointer 简介

AtomicPointerleveldb 提供的一个原子指针操作类,使用了基于内存屏障的同步访问机制,这比用锁和信号量的效率要高。

源文件位置:leveldb/port/atomic_pointer.h

class AtomicPointer {
  private:
    void* rep_;
  public:
    AtomicPointer() { }
    explicit AtomicPointer(void* p) : rep_(p) {}

    // 不使用内存屏障的读操作,即不同步的读操作
    inline void* NoBarrier_Load() const { return rep_; }

    // 同上,是不同步的写操作
    inline void NoBarrier_Store(void* v) { rep_ = v; }

    // 使用内存屏障的读操作,即同步读
    inline void* Acquire_Load() const {
      void* result = rep_;
      // 添加一个内存屏障,后面会有原理介绍
      MemoryBarrier();
      return result;
    }

    // 使用内存屏障的写操作,即同步写
    inline void Release_Store(void* v) {
      MemoryBarrier();
      rep_ = v;
    }
};

这是添加一个内存屏障的函数,当这个函数之前的代码修改了某个变量的内存值后,其他 CPU 和缓存 (Cache) 中的该变量的值将会失效,必须重新从内存中获取该变量的值

inline void MemoryBarrier() {
  __asm__ __volatile__("" : : : "memory");
}

总的来说,AtomicPointer 这个类是为了让我们以更高的效率实现原子性的访问

什么是内存屏障 ?

内存屏障是同步的一种方法,类似于锁和信号量,但是它有更高的效率。内存屏障深入研究的水很深,这里只介绍它的基本用途和使用,而不会深入。

基本用途

避免编译器优化指令

有些编译器默认会在编译期间对代码进行优化,从而改变汇编代码的指令执行顺序,如果你是在单线程上运行可能会正常,但是在多线程环境很可能会发生问题(如果你的程序对指令的执行顺序有严格的要求)。

而内存屏障就可以阻止编译器在编译期间优化我们的指令顺序,为你的程序在多线程环境下的正确运行提供了保障,但是不能阻止 CPU 在运行时重新排序指令。

使得 CPU 和 Cache 可以「看见」内存

如果你想实现下面这样的功能,那你可以考虑内存屏障:

修改一个内存中的变量之后,其余的 CPU 和 Cache 里面该变量的原始数据失效,必须从内存中重新获取这个变量的值

这保证了这个变量对 CPU 和 Cache 是「可见的」,leveldb 就使用了这个特性

基本用法

Gcc

__asm__ __volatile__ ("" ::: "memory");

C++11

atomic_signal_fence(memory_order_acq_rel);

VC++

_ReadWriteBarrier();

Intel ECC compiler

__memory_barrier();

就介绍这个多,能力有限,如果对内存屏障有兴趣,可以参看下面的 wiki

Memory ordering

原文地址

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 从三月份找实习到现在,面了一些公司,挂了不少,但最终还是拿到小米、百度、阿里、京东、新浪、CVTE、乐视家的研发岗...
    时芥蓝阅读 42,384评论 11 349
  • 我们一起来讨论讨论java内存模型。理解内存模型对多线程编程无疑是有好处的。 java代码是如何跑起来的 java...
    caixiangwang阅读 621评论 0 3
  • Java8张图 11、字符串不变性 12、equals()方法、hashCode()方法的区别 13、...
    Miley_MOJIE阅读 3,751评论 0 11
  • 第1章 并发编程的挑战 1.1 上下文切换 即便是单核CPU也支持多线程并发,CPU通过给每个线程分配时间片(几十...
    卑鄙的鹿尤菌阅读 4,841评论 1 22
  • 男人返回女人的世界里,斗三个字“脸皮厚”,我在生活上和职场里也观察过男人。 在职场里,我觉得男人比女人更容易相处,...
    罗瑛敦阅读 1,344评论 0 7