c# - 多生产者,单一消费者

标签 c# c++ multithreading producer-consumer

我必须开发一个多线程应用程序,其中会有多个线程,每个线程生成需要保存在队列中的自定义事件日志(不是 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/

相关文章:

c++ - 将参数传递给线程

multithreading - Streamwriter、StringBuilder 和并行循环

c# - 升级.Net版本后无法加载文件或程序集错误

c# - 在特定位置插入 XML 节点

c++ - 为什么这会在 Visual Studio 2012 而不是 UNIX 中编译?

c++ - 哪个更好地检查 std::string 中是否存在字符?查找还是 find_first_of?

swift - 在后台线程中运行 SpriteKit 进程以提高 CPU 使用率

c# - 我如何防止使用 C# 进行屏幕录制

c# - GDI+ 中两个形状之间的空白区域

c++ - 如何在 vc 2008 或 vc 2010 Beta 中将对话框栏或对话框放入 Pane