下面是 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 竞争,后者在上层调用中已经解决了。
这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。
V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。
V2EX is a community of developers, designers and creative people.