2010-01-06 8 views
9

Lo que necesito es en realidad una estructura de cola flujos seguros, donde varios clientes a mantener el envío de datos en la cola y uno trabajo rosca mantiene el procesamiento y haciendo estallar la cola¿Puedo usar boost :: threadpool como una 'cola segura para hilos'?

¿Hay alguna solución bien establecida existente en AWL o ¿Aumentar?

Ahora pienso en usar Boost :: threadpool para hacer esto. Simplemente configure el número de hilos paralelos para que sean 1, el parámetro de entrada de la función de tareas cambia cada vez que llega un nuevo mensaje de un cliente. ¿Tiene sentido esto? ¿Hay alguna limitación que no haya anticipado aquí?

Respuesta

12

En boost hay un message queue class, eso es lo que necesita: una cola segura para subprocesos.

Las colas de mensajes es un concepto ampliamente utilizado para la comunicación entre procesos. Una cola de mensajes es una cola segura para hilos, cuya característica clave es que bloquea la lectura de la cola vacía y espera a que aparezcan los datos. En esa clase de impulso, también se admiten esperas temporizadas, así como el bloqueo del escritor si la cola está llena.

+3

FYI, la cola de mensajes requiere que los datos sean serializables en binarios [ref] (http://www.boost.org/doc/libs/1_38_0/doc/html/interprocess/synchronization_mechanisms.html#interprocess.synchronization_mechanisms.message_queue) . Entonces usarlo dentro del proceso no es la forma más conveniente. _solo agregando más información, no en contra de la respuesta_ –

9

Si necesita un marco de este tipo en una sola aplicación de proceso, boost :: asio :: io_service debería ser suficiente. Aquí hay una clase de ejemplo de cuadro de trabajo que utiliza boost :: thread y boost :: asio :: io_service.

#include <boost/asio.hpp> 
#include <boost/bind.hpp> 
#include <boost/thread.hpp> 

class IWorkerThreadJob 
{ 
    public: 
     virtual ~IWorkerThreadJob(){}; 
     virtual void execute() = 0; 
}; 


class BoostBasedWorkingBox 
{ 
    public: 

     BoostBasedWorkingBox(): 
      m_IOServiceWork(m_IOService), // Give some work to io_service or else it will simply return from ::run method . 
      m_WorkerThread(boost::bind(&boost::asio::io_service::run, &m_IOService)) 
     {} 

     ~BoostBasedWorkingBox() 
     { 
      m_IOService.stop(); 
      m_WorkerThread.join(); 
     } 

     void processJob(IWorkerThreadJob* pJob) 
     { 
      m_IOService.post(boost::bind(&IWorkerThreadJob::execute,pJob)); 
     } 

    protected: 
     boost::thread m_WorkerThread; 
     boost::asio::io_service m_IOService; 
     boost::asio::io_service::work m_IOServiceWork; 


} 

Uso: - implementar la interfaz IWorkerThreadJob. Proceso de llamada Método de prueba de múltiples clientes.

Aquí boost :: asio :: io_service actúa como una cola segura para hilos.

2

Si está en Windows, puede usar concurrent_queue en ppl.h (nuevo para VS2010). Si no está en Windows, puede usar concurrent_queue.h en los bloques de creación de subprocesos de Intel.

Anthony Williams también tiene una cola basada en la condición variable on his blog que es buena.

Cuestiones relacionadas