围绕Win32的无锁SList是否有一个不错的C ++包装?

时间:2009-04-26 16:11:22

标签: c++ windows linked-list lock-free

Windows提供了一个无锁的单链表,如本页所述: Win32 SList

我想知道这个功能是否存在一个好的C ++包装器。当我说好的时候,我的意思是它尽可能地导出通常的STL接口,支持迭代器等等。我宁愿使用其他人的实现而不是坐下来编写STL类型的容器。

4 个答案:

答案 0 :(得分:5)

您将无法在SList上层叠STL样式界面。为了避免内存管理问题,列表中唯一可访问的节点是列表的头部。访问该节点的唯一方法是将其从列表中弹出。这可以防止两个线程拥有相同的节点,然后一个线程删除该节点,而另一个线程仍在使用它。这就是我所说的“内存管理问题”,是无锁编程中的常见问题。您可以随时弹出第一个节点,然后按照SLIST_ENTRY结构中的“Next”指针进行操作,但这是一个非常糟糕的主意,除非您可以保证在读取节点时节点不会缩小,节点被释放。当然,这仍然会从列表中删除头节点。

基本上你正在尝试使用SList错误。对于您想要做的事情,您只需要使用STL容器并使用锁保护对它的访问。 STL算法不适用于像SList一样可变的无锁数据结构。

所有这一切都说你可以创建一个围绕SList的C ++包装器,但它不会兼容STL。

答案 1 :(得分:3)

值得注意的是,问题中引用的页面上的已发布接口实际上并未实现链接列表(尽管可能是底层结构) - 它实现了堆栈。因此,如果您希望链接列表的功能(例如std :: list)提供,则可能不适合您。

还要注意堆栈不能支持迭代器(它们基本上只支持push和pop),所以支持迭代器和算法的讨论都是一厢情愿的。

答案 2 :(得分:1)

你可以使用boost和:: boost :: iterator_facade快速启动并运行。

不,它不是最佳的或可移植的,迭代器语义是你应该听到的Alexandrescou突然在DevCon上反对。您没有锁定容器,而是锁定(并可能重新锁定和解锁)操作。并且锁定操作意味着串行执行,非常简单。有大量的迭代器操作会对创建的抽象造成不必要的惩罚。

从火星视图来看,迭代器隐藏了指针,隐藏在半OO概念之下,就像OO-vs-Distributed开发一样。我会使用'过程'接口确保并使用户/维护者注意为什么有必要。无锁操作仅与围绕它的“所有并行代码”一样好。自1996年以来人们不断给予scoped_lock包装重新发明的经典例子,它产生漂亮的串行代码。

或者使用原子和Sutter的DDJ条目作为穷人前进方向的参考(以及之后超过10年的Pentium Pro无序性)。

(所有真正发生的事情是,在不可变性之后运行的.net和MS CCR列车之后运行boost和DDJ,以及在锁定开发之后运行良好的OO类似抽象之后运行的英特尔列车。问题是它不能很好地完成并且有些人一次又一次地对抗它;很像TBB的concurrent_vector无意义。同样的原因异常从未实现为无问题,特别是跨环境,以及为什么CPU中的向量处理是相同的原因C ++编译器未充分利用等等......)

答案 3 :(得分:-1)

我认为薄包装应该很容易编写。像1-2页的东西,可能都在.h文件中。而不是梳理谷歌我已经自己写了。