V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
qianjindapang
V2EX  ›  程序员

为什么 Leveldb 中的读操作不需要上锁?

  •  1
     
  •   qianjindapang · 2017-10-30 16:55:00 +08:00 · 2996 次点击
    这是一个创建于 2371 天前的主题,其中的信息可能已经有所发展或是发生改变。

    下面是 skiplist::insert() 的伪代码:

        node = new Node();
        prev = find_place_to_insert();
        node->next = prev->next;
        memory_barrier();
        prev->next = node;
    

    在对 skiplist 写操作时并没有上锁,当两个线程分别对 skiplist 进行读写时能保证安全吗?我的理解是 Node::next 字段需要是原子变量,而 leveldb 代码中它只是一个普通的 void * 类型。

    leveldb 用宏控制的另一个版本中,Node::next 字段确实是stl::atomic类型的,但是没有用 memory barrier。memory barrier 有原子变量的功能?或者说这两者有什么区别?

    这个问题针对 reader-writer 竞争,不是 writer-writer 竞争,后者在上层调用中已经解决了。

    3 条回复    2017-11-02 15:10:16 +08:00
    qianjindapang
        1
    qianjindapang  
    OP
       2017-10-30 17:19:11 +08:00
    标题写错了,应该是*为什么 Leveldb 中 skiplist 的读操作不需要上锁?*
    araraloren
        2
    araraloren  
       2017-10-31 08:49:20 +08:00
    I recommend you learn the c++ memory order and the memory barrier

    some arctile:

    http://blog.csdn.net/world_hello_100/article/details/50131497
    http://blog.csdn.net/cszhouwei/article/details/11730559
    qianjindapang
        3
    qianjindapang  
    OP
       2017-11-02 15:10:16 +08:00
    @araraloren 这好像是个比较大的话题,找到了一本书对这块有详细的介绍
    <<C++ Concurrency in Action: Practical Multithreading>>
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   2418 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 16:07 · PVG 00:07 · LAX 09:07 · JFK 12:07
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.