下面是 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>> |