C#学习教程:实现一个无锁队列(用于Logger组件)我想使用无锁实现。记录事件将从(可能)多个线程发送,尽管实际上只有一个线程会输出到文件/其他存储介质。本质上,所有编写器都将他们的数据排入某个队列,然后由其他某个进程(LogFileWriter)检索。这可以以无锁的方式实现吗?我无法在网上找到对此特定问题的直接参考。如果你发现对于这种情况使用锁太慢,那就有更大的问题了。在我的系统(2.0GHzCore2Quad)上,当没有争用时,锁定大约需要75纳秒。当然,当它争辩时,它需要更长的时间。但是由于锁只保护对Enqueue或Dequeue的调用,因此总日志写入时间不太可能超过75纳秒。如果锁是一个问题——也就是说,如果你发现你的线程在那个锁后面排队并导致你的应用程序显着变慢——那么拥有一个无锁队列不太可能有帮助。为什么?因为如果您真的向日志写入那么多内容,您的无锁阻塞队列将很快填满,您将受限于I/O子系统的速度。我有一个多线程应用程序,它每秒将200个日志条目的顺序写入一个由简单锁保护的队列。我从来没有注意到任何明显的锁争用,而且处理速度也不是特别慢。与其他一切相比,75ns相形见绌。这种无锁队列的实现可能会有所帮助,这是一种数据结构,您可以使用该数据结构将项目排入队列并由记录器写出。http://www.boyet.com/Articles/LockfreeQueue.html您还可以检查.Net4的ConcurrentQueuehttp://www.albahari.com/threading/part5.aspx#_Concurrent_Collectionshttp://geekswithblogs.net/BlackRabbitCoder/archive/2011/02/10/c.net-little-wonders-the-concurrent-collections-1-of-3.aspx无锁队列有不同的实现。我自己在http://hackcraft.github.com/Ariadne/上使用了一种简单的方法,它是开源的,因此您可以根据自己的需要对其进行调整。ConcurrerntQueue也是无锁的,并且可能很好地服务于大多数用途,尽管Ariadne中有支持其他操作的成员(例如将整个内容的枚举出队作为基元操作,允许单个消费者更快地枚举)。以上就是《C#学习教程:实现无锁队列(Logger组件)》的全部内容。如果对你有用,需要进一步了解C#学习教程,希望大家多多关注。本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处:
