2009-04-26 56 views
3

Windows提供了一个无锁单链表,因为在本页面记载: Win32 SListWin32的无锁SList在那里有一个体面的C++包装吗?

我不知道是否有解决此功能的现有良好的C++包装。当我说好时,我的意思是尽可能导出通常的STL接口,支持迭代器等。我宁愿使用别人的实现,而不愿坐下来写一个STL类型的容器。

+0

为什么要麻烦?纯C++实现的开销会更少,并且可能会有大量代码... – Shog9 2009-04-26 16:22:47

+1

因为它是* lockless *线程安全的容器。 – Promit 2009-04-26 16:46:46

回答

1

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

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

从Mars的角度来看,迭代器隐藏了指针,隐藏在一个半OO概念之下,与OO-vs-Distributed开发是不同的。我肯定会使用一个'procedural'接口,用户/维护人员注意为什么这是必要的。无锁操作只与围绕它的“所有并行代码”一样好。自96年起,人们不断给scoped_lock打包重新创建经典示例,它会生成相当多的序列代码。

或者使用原子和Sutter的DDJ条目作为穷人前进的方向(以及超过10年的Pentium Pro之后的无序)。 (真正发生的一切就是增强和DDJ运行后.net和MS CCR列车运行后,不变性,以及英特尔列车运行后,一个良好的类似OO的无锁开发抽象。问题在于它不能很好地完成,有些人一次又一次地去对抗,就像TBB的concurrent_vector废话一样,异常也没有成为无问题的东西,尤其是在不同的环境中,以及为什么CPU中的矢量处理没有被C++编译器等使用...)

-1

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

3

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

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

5

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

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

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