多个生产者,单个消费者

Chr*_*_vr 10 c# c++ multithreading producer-consumer

我必须开发一个多线程应用程序,其中将有多个线程,每个线程生成自定义事件日志并需要保存在队列中保存(不是微软MSMQ).

将有另一个线程从队列中读取日志数据并使用某些信息对其进行操作以将日志信息保存到文件中.基本上,我们在这里实现多个生产者单个消费者范例.

任何机构都可以建议我如何在C++或C#中实现它.

谢谢,

Jim*_*hel 12

使用BlockingCollection<T>定义的这种东西很容易做到System.Collections.Concurrent.

基本上,您创建队列以便所有线程都可以访问它:

BlockingCollection<LogRecord> LogQueue = new BlockingCollection<LogRecord>();
Run Code Online (Sandbox Code Playgroud)

每个生产者都将项添加到队列中:

while (!Shutdown)
{
    LogRecord rec = CreateLogRecord(); // however that's done
    LogQueue.Add(rec);
}
Run Code Online (Sandbox Code Playgroud)

消费者做了类似的事情:

while (!Shutdown)
{
    LogRecord rec = LogQueue.Take();
    // process the record
}
Run Code Online (Sandbox Code Playgroud)

默认情况下,BlockingCollection使用a ConcurrentQueue<T>作为后备存储.该ConcurrentQueue负责线程同步的和,以及BlockingCollection不试图采取一个项目时,非忙等待.也就是说,如果消费者Take在队列中没有项目时进行呼叫,则在项目可用之前进行非忙碌等待(无休眠/旋转).

  • 您可以让生产者调用`CompleteAdding`,它将标记集合完成添加(即不能添加更多项目)。然后消费者可以使用`while (LogQueue.TryTake(out rec, Timeout.Infinite))',这意味着它会清空集合然后退出。如果集合已完成添加且队列为空,则“TakeTake”将返回“False”。 (2认同)