Если вам нужна такая структура в приложении с одним процессом, boost :: asio :: io_service должно быть достаточно. Вот пример рабочего класса с использованием boost :: thread и 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;
}
Использование: -
Реализуйте интерфейс IWorkerThreadJob.
Вызовите метод processJob из нескольких клиентов.
Здесь boost :: asio :: io_service действует как потокобезопасная очередь.