Windows提供一无锁定单链表,如在此页记载: 的Win32 SLIST

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

有帮助吗?

解决方案

您可以快速启动并运行升压和::提高:: iterator_facade。

没有它不会是最优的或便携式和迭代器语义东西,你应该听到Alexandrescou突然在开发者大会站出来反对。你是不是锁定的容器,可以有效地防止(和潜在的重新锁定和解锁)的操作。和锁定装置的操作串行执行,非常简单。有大量的迭代器操纵,这将是不必要的惩罚正在创建抽象为

从火星视图,迭代器隐藏指针,并且下一个半OO概念,其是如赔率为OO-VS-分布式开发隐藏被..我最好使用肯定一个“程序”接口,使用户/维护注意它为什么是必要的。无锁OPS只围绕它“所有的并行代码”为好。和经典的例子,因为人们不断赋予scoped_lock的包装再造96年以来,信贷,它会产生相当的串行代码。

或者使用原子弹和萨特的DDJ条目正向穷人的方式(和超过10年的Pentium Pro的后来unorderedness的)。

参考

(全部是真正发生的是,升压和DDJ是不变性后运行为lockfree发展的良好OO相似的抽象后运行的.NET和MS CCR列车,以及英特尔列车运行后,将问题是,它不能做得很好,有些人又打它时间和时间。就像TBB的concurrent_vector废话一样的道理例外从来没有物化为没有问题的,尤其是在不同环境,同样的原因,在CPU的矢量处理通过C ++编译器等和上未充分利用的。)

其他提示

您将无法在SLIST以往的顶部层中的STL风格的界面。为了避免内存管理问题,在列表中的唯一节点可访问是列表的头部。而访问节点的唯一途径是弹出它关闭名单。这防止两个线程从具有相同节点,然后一个线程,而另一个线程仍然使用它删除该节点。这就是我所说的“内存管理问题”,是无锁编程的一个常见问题。你总是可以弹出第一个节点,然后按照SLIST_ENTRY结构“下一步”指针,其实这是一个非常糟糕的主意,除非你能保证列表不会收缩,与被释放的节点,而你正在阅读它。当然,这还是从列表中删除的头节点。

基本上你要使用SLIST错误。对于这听起来像你想干什么,你只需要使用STL容器,并使用锁保护访问它。 STL算法不会是可变像SLIST无锁数据结构的工作。

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

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

还要注意,堆栈不能支持迭代器(它们基本上只支持PUSH和POP),那么多的支持迭代器和算法的谈话的是妄想。

我认为一个瘦包装应该是很容易编写。像1-2页,可能所有的.h文件。相反,谷歌梳理我会写我自己了。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top