Concurrency 为什么';leveldb中的t skiplist是否需要锁定才能执行GET操作?

Concurrency 为什么';leveldb中的t skiplist是否需要锁定才能执行GET操作?,concurrency,atomic,leveldb,memory-barriers,Concurrency,Atomic,Leveldb,Memory Barriers,以下是skiplist::insert()的伪代码: 写入skiplist(prev->next=node)时,没有锁(在函数insert()和外部调用中)。那么,为什么在一个线程中阅读而在另一个线程中写作是安全的呢 还有另一个实现,它使用std::atomic作为Node::next字段。为什么内存屏障版本不需要使用原子变量 (这是关于读写器竞争,而不是写写器-写器竞争。)带有std::atomic的版本在db/skiplist.h中,但内存屏障版本在哪里?@AlexandrKonovalov

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

写入skiplist(
prev->next=node
)时,没有锁(在函数insert()和外部调用中)。那么,为什么在一个线程中阅读而在另一个线程中写作是安全的呢

还有另一个实现,它使用
std::atomic
作为
Node::next
字段。为什么内存屏障版本不需要使用原子变量


(这是关于读写器竞争,而不是写写器-写器竞争。)

带有std::atomic的版本在db/skiplist.h中,但内存屏障版本在哪里?@AlexandrKonovalov leveldb/port/atomic_pointer.h具有skiplist中使用的AtomicPointer的某些版本。我正在阅读,也许我会在书中找到答案。谢谢你的澄清!因此,您的问题可能会被重新表述为“为什么获取/释放对相当于MemoryBarrier”,也就是说。带有std::atomic的版本在db/skiplist.h中,但内存屏障版本在哪里?@AlexandrKonovalov leveldb/port/atomic_pointer.h有一些在skiplist中使用的AtomicPointer版本。我正在阅读,也许我会在书中找到答案。谢谢你的澄清!因此,您的问题可能会被重新表述为“为什么获取/释放对等同于MemoryBarrier”,也就是说。
 node = new Node();
 prev = find_place_to_insert();
 node->next = prev->next;
 memory_barrier();
 prev->next = node;