下面是 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 竞争,后者在上层调用中已经解决了。
1 qianjindapang OP 标题写错了,应该是*为什么 Leveldb 中 skiplist 的读操作不需要上锁?* |
![]() | 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 |
3 qianjindapang OP @araraloren 这好像是个比较大的话题,找到了一本书对这块有详细的介绍 <<C++ Concurrency in Action: Practical Multithreading>> |