实现无锁队列(对于Logger组件)

lys*_*cid 2 .net c# concurrency multithreading lockless

我正在设计一个新的改进的Logger组件(.NET 3.5,C#).

我想使用无锁实现.

记录事件将从(潜在地)多个线程中发送,尽管只有单个线程将执行实际输出到文件/其它存储介质.

从本质上讲,所有的编写器都将它们的数据排入某个队列,然后通过其他一些进程(LogFileWriter)进行检索.

这可以通过无锁方式实现吗?我无法在网上找到这个特定问题的直接参考.

Jim*_*hel 13

如果您发现在这种情况下使用锁定太慢,则会出现更大的问题.锁定,当它没有争用时,在我的系统上需要大约75纳秒(2.0 GHz Core 2 Quad).当它争论时,当然,它需要更长的时间.但由于锁只是保护对Enqueueor 的调用Dequeue,因此日志写入的总时间不可能远远超过75纳秒.

如果锁一个问题 - 也就是说,如果你发现你的线程排在该锁后面并导致你的应用程序显着减速 - 那么建立一个无锁队列就不太可能有所帮助.为什么?因为如果你真的那么多地写入日志,那么你的无锁阻塞队列将会如此快地填满,你将被限制在I/O子系统的速度上.

我有一个多线程应用程序,每秒写入200个日志条目的顺序, Queue<string>由一个简单的锁保护.我从来没有注意到任何明显的锁争用,并且处理速度不会太慢.75 ns与其他所有事情相比已经相形见绌了.


hat*_*ica 5

这种无锁队列的实现可能会有所帮助,其中队列是您用于将要出列的项目入队并由记录器写出的数据结构.

http://www.boyet.com/Articles/LockfreeQueue.html

您也可以查看.Net 4的ConcurrentQueue

http://www.albahari.com/threading/part5.aspx#_Concurrent_Collections

http://geekswithblogs.net/BlackRabbitCoder/archive/2011/02/10/c.net-little-wonders-the-concurrent-collections-1-of-3.aspx