Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
.net C语言中的无锁堆栈和队列#_.net_Multithreading_Data Structures_Synchronization_Lock Free - Fatal编程技术网

.net C语言中的无锁堆栈和队列#

.net C语言中的无锁堆栈和队列#,.net,multithreading,data-structures,synchronization,lock-free,.net,Multithreading,Data Structures,Synchronization,Lock Free,有人知道是否有可用于.NET的无锁容器库吗 最好是被证明能工作并且比我们在.NET中的同步包装器更快的东西 我在.NET上找到了一些文章,但没有一篇详细说明任何速度基准,也没有激发人们对其可靠性的信心 谢谢您指的是PFX框架(Parallels for.NET)、ConcurrentQueue和ConcurrentStack中存在的容器类吗 晚了,但总比没有好,我想我会把朱利安·巴克纳尔的文章添加到这个列表中 但他没有业绩数据。在我对他的结构进行的测试中,与锁定(与ReaderWriterLoc

有人知道是否有可用于.NET的无锁容器库吗

最好是被证明能工作并且比我们在.NET中的同步包装器更快的东西

我在.NET上找到了一些文章,但没有一篇详细说明任何速度基准,也没有激发人们对其可靠性的信心


谢谢

您指的是PFX框架(Parallels for.NET)、ConcurrentQueue和ConcurrentStack中存在的容器类吗


晚了,但总比没有好,我想我会把朱利安·巴克纳尔的文章添加到这个列表中

但他没有业绩数据。在我对他的结构进行的测试中,与锁定(与ReaderWriterLock相比,内核使用率非常低)相比,列表的伸缩性很好

他的博客上有一系列关于C#中无锁结构的文章


无锁数据结构将出现问题,直到它们修改CLR时内存模型造成的混乱,请参阅CLI规范


无锁编程非常困难,您不应该在集合(容器)级别对其进行麻烦。对于任何语言都是如此。

在不了解它的情况下,我偶然发现了一个库


虽然可能不是您想要的,但至少有一个关于堆栈溢出的实现和讨论。通过StackOverflow代码检查过程可能会让您对其安全性有一些信心,或者提供有关如何自己构建免锁容器的信息。

PFX看起来不错,但是文档似乎暗示ConcurrentQueue和ConcurrentStack使用锁来提供线程安全性,我会不惜一切代价避免PFX。我们看到了8倍(没错)的降级,然后才意识到这真的不会给你任何一本好书不会教你做得更好的东西。@Radu094:Joe Duffy的书《Windows上的并发编程》指出,
ConcurrentQueue
目前是无锁的@rama jka toti:.NET4中的东西比CTP好得多,但我还没有测试过无锁数据结构的替代方案。当然,它们仍然比线程不安全的同类产品慢得多。这里有一个很好的讨论,这意味着编写(添加)并发集合的速度较慢,并且使用锁定,但是从它们读取数据的速度也更快@dodgy_coder,这篇文章考虑了一个作者,多个读者的情况。对于多个编写器、多个读取器的情况,我希望并发集合的编写速度也会快得多。请跟踪并发布您可能在测试过的无锁结构上发现的任何性能相关数据。我们最终滚动了自己的容器,很大程度上基于。使用免锁容器与标准容器相比,我们处理样品批次所需总时间的边际(平均)减少了约12%。总之,我会说这不值得努力:-(我遇到了有这些的。但是我很难理解代码。它有一些奇怪的空语句,比如(;){…一些代码…}的
,它里面会有一个return语句。它的顶部有一个注释,说明:“考虑到4.0 FCL已经有一个无锁队列,此队列主要用于完成或用于库中的其他类。Mono实现与此非常接近,而MS实现更复杂,但应提供更好的CPU缓存使用。。。“@LouisSomers我不是那么古怪,而是老式的;对于无限循环(或循环定义中的条件以外的条件)来说,这曾经是一种流行的样式,尽管
而(true)
在今天可能更流行,前者在我看来是“永远”,而后者则是“虽然宇宙的基本逻辑规则成立”,这让我有点不安。我确实在FCL之外添加了一些功能,因为那条评论,我应该编辑它,但我想我会把它保存到今年晚些时候进行更彻底的审查。@LouisSomers我对“古怪”很酷“,该库中的某些代码在速度上确实很奇怪(
goto
在手动编码的尾部调用消除中),或者奇怪,因为与不必考虑并发性的情况相比,状态转换是不寻常的。
while(true)
for(;;)不过是完全相同的,它只是风格的问题。<代码> >(Stroustrup)的C++书中使用了<(代码)>,但是<>代码>(true)后来变得更流行,所以<代码>((;))< /C> >只是更老式。(还有一些旧的工具会抱怨常数,虽然不是C)。…内核使用与他正在使用的CAS无关。CAS是一个重量级的锤子,但在CLR中,您现在几乎没有太多的选择。CAS与ReaderWriterLock相比,在内核时间上很轻。在循环中比较这两个。一个将使用所有用户空间时间,另一个将使用所有内核时间。除非你事先就知道你的元素不会被删除。C#我相信会进行垃圾收集(这会剥夺使用无锁的一些意义!)所以在C中,我相信堆栈被打破了,在POP.BTW中的正常bug,我关于堆栈被破解的评论是完全错误的。@空白沙维尔。不是完全的。如果你要对C或C++做一个天真的端口,它就会被破坏,而且很难做一个“适当的”。端口,因为您必须找到某种方法来处理C#依赖于GC处理的内容。因此,是的,您的评论是错误的,但并非“完全”错误,因为它确实解决了算法所依赖的运行时条件的一个重要问题。您能详细说明“修改CLR”吗?你认为错在哪里?他试图暗示CLR所做的保证足够弱。尽管CLR内存模型不难理解,可能导致复杂性