【发布时间】:2012-01-04 23:51:14
【问题描述】:
我正在设计一个新的改进的 Logger 组件(.NET 3.5,C#)。
我想使用无锁实现。
日志事件将从(可能)多个线程发送,尽管只有一个单个线程将实际输出到文件/其他存储介质。
本质上,所有的作者都*将他们的数据排入队列*,以便由其他进程(LogFileWriter)检索。
这可以通过无锁的方式实现吗?我在网上找不到这个特定问题的直接参考。
【问题讨论】:
-
..可能是因为没有需求。大多数日志记录活动的一端是间歇性的日志供应,另一端是慢速磁盘。锁定的、由内核管理的队列对于此类功能最有效。是否有一些特殊原因说明您的应用可能需要无锁队列?
-
我不确定大多数记录器是否使用锁定,即使可以不使用它也是如此。我的要求是高性能,这意味着尽快释放调用记录器的线程。在这种情况下,抢锁似乎是一种浪费。
-
我同意汉斯的观点。 logging.apache.org/log4net 很有可能比自制系统更快,并且肯定会花费更少的时间进行开发和调试以正常运行。
-
关于性能记录器,使用 DateTime.UtcNow。它比 DateTime.Now 快得多,并且在分析我的应用程序时对日志记录线程产生了重大影响。我使用 log4net。
-
@liortal - 允许多个生产者的无锁队列实现非常简单。然后是如何向消费者/记录器线程发出一个新条目已添加的信号的问题,以便它可以检索它并记录它。我会使用信号量,但还有其他 condvar 事物。无论您使用什么,这可能意味着内核调用向记录器发出信号。以无锁方式避免内核调用的唯一途径是生产者对队列进行自旋锁并确定队列计数不为零。如果你能做到这些,你就不需要任何帮助!
标签: c# .net multithreading concurrency lockless