Win32的无锁SList是否有一个像样的C ++包装?

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

我想知道是否有一个良好的C ++包装这个function。 当我说好的时候,我的意思是尽可能的导出通常的STL接口,支持迭代器等。我宁愿用别人的实现,也不愿坐下来写一个STLtypes的容器。

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

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

从火星的角度来看,迭代器隐藏了指针,隐藏在与面向对象分布式开发不同的半面向对象的概念之下。我肯定会使用“过程式”接口,并使用户/维护者支付注意为什么这是必要的。 无锁操作只与周围的所有“并行代码”一样好。 自96年起,人们不断给scoped_lock包装进行重新包装,它产生了很好的序列化代码。

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

(所有真正发生的事情就是提升和DDJ运行后.net和MS CCR列车运行后,不变性,以及英特尔列车运行后,一个良好的面向对象类似的抽象无锁开发。问题是不能很好地完成,有些人一次又一次地去对抗,就像TBB的concurrent_vector废话一样,异常从来没有成为没有问题的原因,特别是在不同的环境中,以及为什么CPU中的向量处理没有被C ++利用编译器等等..)

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

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

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

值得注意的是,在问题中引用的页面上发布的接口实际上并没有实现链表(尽管这可能是底层结构) – 它实现了一个堆栈。 所以如果你想要像std :: list这样的类提供的链表的功能,这可能不适合你。

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

我觉得一个薄包装应该很容易写。 像1-2页的东西,可能全部在.h文件中。 而不是梳理谷歌我会写我自己已经。