Boost 为什么深层次使用无锁编程的高级抽象不是';不受欢迎?

Boost 为什么深层次使用无锁编程的高级抽象不是';不受欢迎?,boost,queue,lock-free,concurrent-programming,Boost,Queue,Lock Free,Concurrent Programming,从我收集的关于无锁编程的信息来看,要正确地做是非常困难的。。。我也同意。 一想到一些问题我就头疼。但我想知道的是,为什么不是 高级包装器是否广泛使用(例如无锁队列和类似的东西)? 例如,boost没有无锁库,尽管据我所知,有人建议使用一个无锁库。 我的意思是,我想有很多应用程序,你无法避免的事实是,关键的 截面是荷载的主要部分。那么原因是什么呢?是不是 专利——我听说一些与无锁编程相关的东西已经获得了专利 表演 谷歌和微软都有这样的内部库,但没有一个是公共的 还有别的吗 所以我的问题是:为什么深

从我收集的关于无锁编程的信息来看,要正确地做是非常困难的。。。我也同意。 一想到一些问题我就头疼。但我想知道的是,为什么不是 高级包装器是否广泛使用(例如无锁队列和类似的东西)? 例如,boost没有无锁库,尽管据我所知,有人建议使用一个无锁库。 我的意思是,我想有很多应用程序,你无法避免的事实是,关键的 截面是荷载的主要部分。那么原因是什么呢?是不是

  • 专利——我听说一些与无锁编程相关的东西已经获得了专利
  • 表演
  • 谷歌和微软都有这样的内部库,但没有一个是公共的
  • 还有别的吗
  • 所以我的问题是:为什么深层次使用无锁编程的高级抽象不是很好 流行,而同时“常规”多线程编程是“在”


    编辑:boost获得了一个无锁库:)

    至少有一个有点流行的“无锁”框架:Erlang。

    很少有人对该领域足够熟悉,能够实现易于使用的无锁库。在这些少数人中,甚至更少的人免费发布工作,而在那些几乎没有人做重要的额外工作以使库可用-例如发布完整的API文档等。他们倾向于只发布带有代码的zip文件,这几乎是无用的。当然,你还需要找到一个库,它是用你想要使用的语言编写的,在你使用的平台上编译,最后,库中的单词必须出来,让人们知道它的存在

    专利是一个问题,因为它们限制了可以提供的东西。例如,据我所知,没有非专利单链表。所有跳过列表的东西也都有大量的专利

    这个领域的英雄是Cliff Click,他提出了一个无锁散列,他或多或少地将其放在了公共领域

    你可以在这里找到我的无锁图书馆

    另一个是Samy Bahra的并发工具包


    仅供参考Microsoft的.Net framework在.Net 4.0中获得了一些无锁类。即System.Collections.Concurrent命名空间中的容器类,它们是:

    ConcurrentDictionary
    ConcurrentQueue
    ConcurrentStack
    

    我已经研究了它们的实现,它们在引擎盖下相对较不灵活/复杂,因此它们在设计和测试中确实表现出了大量的努力(线程问题当然是很难测试到高标准)。

    < P>您可以查看C++库。它是无锁容器(堆栈、队列、集合和映射)和安全内存回收算法的集合

    关于C++(我不是其他语言的高级语言)。新的C++标准刚刚发布,编译器开发人员需要时间来实现它的要求。如今,并非所有编译器都完全支持C++11内存模型,因为它需要对编译器的优化规则进行重大更改。最近,微软宣布支持原子操作,这是VC++11开发者预览版中无锁编程的基础。这对我们来说是个好消息。正如我所知,GCC将在4.8(或更高版本)中支持它

    第二个问题是专利。许多有趣的无锁容器算法都获得了专利,这是将它们包含到供应商库中的障碍

    第三,无锁容器的主要部分是垃圾收集(安全内存回收)。C++没有任何GC(幸运的)。有一些GC算法(危险指针法、推卸责任法、基于历元法等),但大多数算法也获得了专利

    第四,没有足够的工具来证明在无锁实现中应用的内存围栏的正确性。现在我只知道一个-(http://www.1024cores.net/home/relacy-race-detector).

    我认为2-3年后,我们将看到许多生产的多平台C++库,它们是无锁容器和算法。这些库是由供应商和爱好者开发的


    然而,在我看来,我们的未来是硬件事务内存(HTM)。今天,AMD、Sun(对不起,Oracle)、Intel(?)正在研究HTM,结果非常有趣。让我们等待。

    一个主要问题是,除非一个人使用过多的内存屏障,否则很难确定他是否有足够的内存;如果一个人确实使用了过多的内存屏障,那么性能很可能不如使用锁时的性能


    锁的最大问题不是性能,而是健壮性。如果线程在持有锁时被阻塞,系统将死亡。相反,如果访问无锁数据结构的线程被阻止,则不会影响其他线程对其的使用。在某些情况下,无锁数据结构可能比使用锁的数据结构更可取,即使性能较差,因为必须保护系统不被故障线程破坏(例如,即使准备在不关闭进程的情况下杀死一个命中StackOverflowException的线程,在调用一个方法来访问该方法所访问的锁保护数据结构之前,如何防止线程在堆栈上放置大量内容,从而使锁保护的方法命中堆栈溢出?)如果使用无锁数据结构,这样的风险就不是问题。

    我想更多关于艾达、C或C++库……但+1,我不知道Erlang是Cuff-FieleRunn运行时系统,主要是用C编写的。通过NIF接口或与CalC++进行对话非常简单。所以,点击。我将他的算法移植到.NET。(首先是作为一个相对直接的端口,然后是一个更彻底的重写,使用他的基本思想,但适应了JVM上CLR的不同优点和缺点),知道它安全地脱离了pa非常好