Múltiples productores, solo consumidor

Tengo que desarrollar una aplicación de subprocesos múltiples, donde habrá múltiples hilos, cada hilo genera un registro de eventos personalizado y necesita guardarse en la cola guardada (no en Microsoft MSMQ).

Habrá otro hilo que leerá los datos de registro de la cola y los manipulará con cierta información para guardar la información de registro en un archivo. Básicamente, aquí estamos implementando el paradigma del consumidor único productor múltiple.

¿Puede algún cuerpo Sugerirme cómo implementar esto en C ++ o C #.

Gracias,

    Este tipo de cosas es muy fácil de hacer usando BlockingCollection definido en System.Collections.Concurrent .

    Básicamente, creas tu cola para que todos los hilos puedan acceder a ella:

     BlockingCollection LogQueue = new BlockingCollection(); 

    Cada productor agrega elementos a la cola:

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

    Y el consumidor hace algo similar:

     while (!Shutdown) { LogRecord rec = LogQueue.Take(); // process the record } 

    De forma predeterminada, BlockingCollection utiliza un ConcurrentQueue como la tienda de respaldo. ConcurrentQueue se ocupa de la sincronización de subprocesos y, y BlockingCollection tiene una espera no ocupada cuando intenta tomar un elemento. Es decir, si el consumidor llama a Take cuando no hay elementos en la cola, hace una espera no ocupada (sin dormir / girar) hasta que un artículo esté disponible.

    Puede usar una cola sincronizada (si tiene un código .NET 3.5 o anterior) o incluso mejor la nueva ConcurrentQueue !

    Lo que está planeando es una cola de consumidor de productor clásico con un hilo que consum los artículos en la cola para hacer algo de trabajo. Esto se puede incluir en una construcción de nivel superior llamada “actor” u “objeto activo”.

    Básicamente, esto envuelve la cola y el hilo que consume los elementos en una sola clase, el otro enhebra todos los métodos asíncronos de esta clase y coloca los mensajes en la cola para que los realice el hilo del actor. En su caso, la clase podría tener un único método, writeData, que almacena los datos en la cola y desencadena la variable de condición para notificar al hilo del actor que hay algo en la cola. El hilo del actor ve si hay datos en la cola si no espera la variable de condición.

    Aquí hay un buen artículo sobre el concepto:

    http://www.drdobbs.com/go-parallel/article/showArticle.jhtml;jsessionid=UTEXJOTLP0YDNQE1GHPSKH4ATMY32JVN?articleID=225700095

    Múltiples productores, consumidor único es el escenario más fácil para la comunicación de cola multihilo. Se puede implementar una cola de hilos como una combinación de condición variable / mutex y std :: queue (agregue un cv si desea manejar la cola llena).

    El consumidor espera en el cv mientras la cola está vacía. los productores señalizan al agregar a la cola (envío).