在big-O运行时方面,似乎两个数据结构在“平均”情况下都具有:
O(1)
插入/删除到开头和结尾O(n)
插入/删除到任意索引O(1)
查找开始和结束循环缓冲区的优点:
O(1)
查找,而不是任意索引的O(n)
memmove
)而进行的快速填充链接列表的优点:
O(1)
插入/删除到某个特定位置(例如,可以在链接列表的中间进行插入/删除)。循环缓冲区可以做到,但是更复杂O(1)
在最坏的情况下插入,与O(n)
的循环缓冲区(需要增加缓冲区的情况)不同基于此列表,在我看来,循环缓冲区在几乎每种情况下都是更好的选择。我想念什么吗?
答案 0 :(得分:1)
MCS锁是现有的最具扩展性的锁设计之一。线程使用原子比较和交换来尝试获取锁。如果成功,那就完成了。如果不起作用,则该线程使用原子交换将自己排入等待者列表的末尾。
没有办法使用无锁的循环缓冲区或使用更复杂的原子指令来做类似的事情。