Boost 为什么深层次使用无锁编程的高级抽象不是';不受欢迎?
从我收集的关于无锁编程的信息来看,要正确地做是非常困难的。。。我也同意。 一想到一些问题我就头疼。但我想知道的是,为什么不是 高级包装器是否广泛使用(例如无锁队列和类似的东西)? 例如,boost没有无锁库,尽管据我所知,有人建议使用一个无锁库。 我的意思是,我想有很多应用程序,你无法避免的事实是,关键的 截面是荷载的主要部分。那么原因是什么呢?是不是Boost 为什么深层次使用无锁编程的高级抽象不是';不受欢迎?,boost,queue,lock-free,concurrent-programming,Boost,Queue,Lock Free,Concurrent Programming,从我收集的关于无锁编程的信息来看,要正确地做是非常困难的。。。我也同意。 一想到一些问题我就头疼。但我想知道的是,为什么不是 高级包装器是否广泛使用(例如无锁队列和类似的东西)? 例如,boost没有无锁库,尽管据我所知,有人建议使用一个无锁库。 我的意思是,我想有很多应用程序,你无法避免的事实是,关键的 截面是荷载的主要部分。那么原因是什么呢?是不是 专利——我听说一些与无锁编程相关的东西已经获得了专利 表演 谷歌和微软都有这样的内部库,但没有一个是公共的 还有别的吗 所以我的问题是:为什么深
编辑:boost获得了一个无锁库:)至少有一个有点流行的“无锁”框架:Erlang。很少有人对该领域足够熟悉,能够实现易于使用的无锁库。在这些少数人中,甚至更少的人免费发布工作,而在那些几乎没有人做重要的额外工作以使库可用-例如发布完整的API文档等。他们倾向于只发布带有代码的zip文件,这几乎是无用的。当然,你还需要找到一个库,它是用你想要使用的语言编写的,在你使用的平台上编译,最后,库中的单词必须出来,让人们知道它的存在 专利是一个问题,因为它们限制了可以提供的东西。例如,据我所知,没有非专利单链表。所有跳过列表的东西也都有大量的专利 这个领域的英雄是Cliff Click,他提出了一个无锁散列,他或多或少地将其放在了公共领域 你可以在这里找到我的无锁图书馆 另一个是Samy Bahra的并发工具包
仅供参考Microsoft的.Net framework在.Net 4.0中获得了一些无锁类。即System.Collections.Concurrent命名空间中的容器类,它们是:
ConcurrentDictionary
ConcurrentQueue
ConcurrentStack
我已经研究了它们的实现,它们在引擎盖下相对较不灵活/复杂,因此它们在设计和测试中确实表现出了大量的努力(线程问题当然是很难测试到高标准)。
< P>您可以查看C++库。它是无锁容器(堆栈、队列、集合和映射)和安全内存回收算法的集合然而,在我看来,我们的未来是硬件事务内存(HTM)。今天,AMD、Sun(对不起,Oracle)、Intel(?)正在研究HTM,结果非常有趣。让我们等待。一个主要问题是,除非一个人使用过多的内存屏障,否则很难确定他是否有足够的内存;如果一个人确实使用了过多的内存屏障,那么性能很可能不如使用锁时的性能
锁的最大问题不是性能,而是健壮性。如果线程在持有锁时被阻塞,系统将死亡。相反,如果访问无锁数据结构的线程被阻止,则不会影响其他线程对其的使用。在某些情况下,无锁数据结构可能比使用锁的数据结构更可取,即使性能较差,因为必须保护系统不被故障线程破坏(例如,即使准备在不关闭进程的情况下杀死一个命中StackOverflowException的线程,在调用一个方法来访问该方法所访问的锁保护数据结构之前,如何防止线程在堆栈上放置大量内容,从而使锁保护的方法命中堆栈溢出?)如果使用无锁数据结构,这样的风险就不是问题。我想更多关于艾达、C或C++库……但+1,我不知道Erlang是Cuff-FieleRunn运行时系统,主要是用C编写的。通过NIF接口或与CalC++进行对话非常简单。所以,点击。我将他的算法移植到.NET。(首先是作为一个相对直接的端口,然后是一个更彻底的重写,使用他的基本思想,但适应了JVM上CLR的不同优点和缺点),知道它安全地脱离了pa非常好