无链接编程没有链接列表
Lock-free programming without linked lists
我多次阅读,链接的列表充其量是由于其较差的高速缓存位置而适合通用使用的利基数据结构。然而,我看到的几乎每个无锁数据结构的示例都使用链接列表。 c 并发和例如,多处理器编程的艺术,例如,在实现无锁堆栈和队列时使用链接列表。
设计无锁容器时,是否有更好的替代方案,例如堆栈和队列?
设计无锁容器时,是否有更好的替代方案
是的,可能是出于某些目的。链接列表只是许多应用程序概括的最简单的东西。
如果您使用单连接的列表(在最简单的情况下),则可以完全没有同步问题填充节点( =多个线程可以同时填充节点),并且唯一的同步操作是头排交换。
因此,尽管没有其他建议的链接列表以进行性能,但您可以看到这些通用性,即任意大型且复杂的节点,以及任意数量的生产者和消费者。
比较圆形缓冲区:如果您有多个生产商,则需要某种方法来标记一部分保留的缓冲区(在其他文字中受到保护),然后才能阅读。这是因为所有生产商都共享相同的缓冲区,而不是使用自己的节点。它是可行的,但本质上是非原子,仅仅是因为您无法以相同的方式准备共享缓冲区的一部分 您可以准备一个单独的节点。
如果您有一个生产者,它很容易,并且确实比链接列表具有更好的位置,但是显然。。
链接列表不一定意味着缺乏本地性。如果列表中的所有节点都是通过单个分配(C中的Malloc)分配的,那么无论节点如何彼此指向,所有节点的内存都将是连续的。如果sizeof(node) * max_nodes_count相对较小,则可能适合各种缓存级别。
相关文章:
- 从链接列表c++中删除一个项目
- 读取文件的最后一行并输入到链接列表时出错
- 下面是我为检测链接列表中的循环而制作的代码
- 有人能帮我处理这个链接列表吗?C++
- C++ 创建包含链表和字符串的对象的链接列表时出错
- 你能检查一下为什么在这个代码中从链接列表中删除项目不起作用吗
- 为什么它只打印双链接列表的第一个值,而我的程序却崩溃了
- 链接列表运算符重载没有打印出我想要的内容
- 链接列表在 cpp 中包含不同的对象类
- 创建一个棋盘格或"Interweave"两个链接列表。IE 更改两个链表的指针
- 如何在构建链接列表时调整头、尾指针
- Shared_ptr双链接列表内存泄漏
- 为什么每当我尝试运行此链接列表删除功能时都会收到分段错误错误?
- 在链接列表中查找元素 - C++
- 删除链接列表中剩余的最后一个节点
- 只有我的"链接列表"中的第一个节点正在打印
- 避免在使用链接列表从 deque 中删除最后一个节点时出现内存泄漏
- C++ 分段错误:11 错误,同时编码将两个数字相加的链接列表
- 如何在C / C++中正确实现链接列表而不会使程序崩溃
- 将元素插入链接列表