这些是skiplist :: insert()的伪代码:
node = new Node();
prev = find_place_to_insert();
node->next = prev->next;
memory_barrier();
prev->next = node;
写入skiplist(prev->next = node
)时没有锁定(在函数insert()和外部调用中)。那么为什么在另一个线程中读取而在另一个线程中读取是安全的呢?
还有另一个实现,std::atomic
字段使用Node::next
。为什么内存屏障版本不需要使用原子变量?
(这是关于读者 - 作家的比赛,而不是作家 - 作家的比赛。)