给定一个(双重)对象链接列表(C++),我有一个我想要多线程的操作来对每个对象执行。每个对象的操作成本并不统一。出于各种原因,链表是这组对象的首选存储。每个对象中的第一个元素是指向下一个对象的指针;第二个元素是列表中的前一个对象。
我通过构建节点数组并应用 OpenMP 解决了这个问题。这给出了不错的表现。然后我切换到我自己的线程例程(基于 Windows 原语)并通过使用 InterlockedIncrement()(作用于数组的索引),我可以获得更高的整体 CPU 利用率和更快的吞吐量。本质上,线程通过沿元素“跨越式”工作。
我的下一个优化方法是尝试消除在我的链表中创建/重用元素数组。但是,我想继续使用这种“跳跃式”方法,并以某种方式使用一些不存在的例程,可以称为“InterlockedCompareDereference” - 以原子方式与 NULL(列表末尾)进行比较并有条件地取消引用并存储,返回取消引用的值.
我不认为 InterlockedCompareExchangePointer() 会起作用,因为我不能原子地取消引用指针并调用这个 Interlocked() 方法。我已经阅读了一些内容,而其他人则建议使用关键部分或自旋锁。关键部分在这里似乎很重要。我很想尝试自旋锁,但我想我首先在这里提出问题并询问其他人在做什么。我不相信 InterlockedCompareExchangePointer() 方法本身可以像自旋锁一样使用。然后还必须考虑获取/释放/栅栏语义......
想法?谢谢!