我必须开发一个多线程应用程序,其中会有多个线程,每个线程生成需要保存在队列中的自定义事件日志(不是 Microsoft MSMQ)。
还会有另外一个线程从队列中读取日志数据并进行操作,根据一定的信息将日志信息保存到文件中。基本上,我们在这里实现多生产者、单一消费者范式。
谁能提供有关如何在 C++ 或 C# 中实现此功能的建议。
谢谢,
最佳答案
使用 BlockingCollection<T>
很容易做到这一点在 System.Collections.Concurrent
中定义.
基本上,您创建队列以便所有线程都可以访问它:
BlockingCollection<LogRecord> LogQueue = new BlockingCollection<LogRecord>();
每个生产者向队列中添加项目:
while (!Shutdown)
{
LogRecord rec = CreateLogRecord(); // however that's done
LogQueue.Add(rec);
}
消费者做类似的事情:
while (!Shutdown)
{
LogRecord rec = LogQueue.Take();
// process the record
}
默认情况下,BlockingCollection
使用 ConcurrentQueue<T>
作为后备商店。 ConcurrentQueue
负责线程同步,并且 BlockingCollection
尝试拿取元素时进行非忙碌等待。也就是说,如果消费者调用 Take
当队列中没有项目时,它会进行非忙碌等待(不休眠/旋转)直到有项目可用。
关于c# - 多生产者,单一消费者,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5105382/