c++ - 多线程链表遍历

标签 c++ list linked-list

给定一个(双向)对象链表 (C++),我有一个我希望多线程对每个对象执行的操作。每个对象的操作成本并不统一。出于各种原因,链表是这组对象的首选存储方式。每个对象中的第一个元素是指向下一个对象的指针;第二个元素是列表中的前一个对象。

我已经通过构建节点数组并应用 OpenMP 解决了这个问题。这给出了不错的性能。然后我切换到我自己的线程例程(基于 Windows 基元)并通过使用 InterlockedIncrement()(作用于数组的索引),我可以获得更高的整体 CPU 利用率和更快的吞吐量。本质上,线程通过沿着元素“跳跃式”工作。

我的下一个优化方法是尝试消除在我的链接列表中创建/重用元素数组。但是,我想继续使用这种“蛙跳”方法,并以某种方式使用一些不存在的例程,这些例程可以称为“InterlockedCompareDereference”——以原子方式与 NULL(列表末尾)进行比较,并有条件地取消引用和存储,返回取消引用的值.

我不认为 InterlockedCompareExchangePointer() 会起作用,因为我不能以原子方式取消对指针的引用并调用此 Interlocked() 方法。我读过一些书,其他人建议使用临界区或自旋锁。关键部分在这里似乎很重要。我很想尝试自旋锁,但我想我应该先在这里提出问题,然后问问其他人在做什么。我不相信 InterlockedCompareExchangePointer() 方法本身可以像自旋锁一样使用。然后还必须考虑获取/释放/栅栏语义...

想法?谢谢!

最佳答案

关键部分并不是真正的重量级。假设它们可以快速获取锁,它们就像自旋锁一样。

问题的解决方案取决于您是否修改列表。如果您不修改列表,您需要做的就是对初始化为 0 的对象中的值进行 InterlockedCompareExchange 之类的操作。交换值为 1,如果返回 0,则执行操作,如果返回 1,你跳过。下次您在列表上执行操作时,您交换 2 并检查 1/2 而不是 0/1。

如果您要更改列表,则一切都取决于。如果你只想向前移动,并且只删除当前节点,那么你最好的选择是在进行比较交换位时,跳跃时(获取它的下一个节点)和删除时锁定你锁定的项目节点。

关于c++ - 多线程链表遍历,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12591005/

相关文章:

c++ - WINAPI C++ VS 2008 与 VS 2010

c++ - 在 C++ 中制作奇数维多维数组的最佳方法?

c++ - 使用数组减去数字 - C++

导航链表时无法访问指针

java - 关于Java LinkedList方法的问题

c++ - 列表迭代器不可取消引用?

java - 我如何允许用户添加、编辑、删除列表组?如教室、小屋等

c# - 当反射类型本身是 List 时实例化通用 c# List

python - 在 Python 中连接字符串

c++ - 一个通用的双向链表,创建链表时赋值错误