Это довольно просто.Вам нужны некоторые классы:
Класс задач с методом run - что-то, что пользователь пула должен переопределить для создания своих собственных задач.
Объект-потребитель-потребитель для очереди, которую ожидают потокина работу.Если у вас есть std :: deque, это довольно просто.Если нет, вам придется кодировать свой собственный тип очереди.Как и класс очереди, вам потребуются другие вещи для синхронизации, может быть CriticalSection / Mutex для защиты очереди и семафор для потоков, ожидающих.
Класс threadPool - то, что содержит очередь ПК, отправьте(TaskClass aTask) и другие вещи.
Куча потоков, созданных в ctor-потоке - используйте CreateThread и передайте экземпляр threadPool в качестве параметра lpParam, чтобы потоки могли снова привести его обратно, чтобы получить доступ кthreadPool.
Потоки ожидают работы threadPool-> objectQueue, например:
// header
class threadPool;
class task {
friend class threadPool;
private:
threadPool *myPool;
public:
virtual void run()=0;
};
class PCSqueue{
private:
CRITICAL_SECTION access;
deque<task*> *objectQueue;
HANDLE queueSema;
public:
PCSqueue();
void push(task *ref);
bool pop(task **ref,DWORD timeout);
};
class threadPool {
private:
int threadCount;
public:
PCSqueue *queue;
threadPool(int initThreads);
static DWORD _stdcall staticThreadRun(void *param){
threadPool *myPool=(threadPool *)param;
task *thisTask;
while (myPool->queue->pop(&thisTask,INFINITE)){
thisTask->run();
}
}
void submit(task *aTask);
};
// cpp
PCSqueue::PCSqueue(){
objectQueue=new deque<task*>;
InitializeCriticalSection(&access);
queueSema=CreateSemaphore(NULL,0,MAXINT,NULL);
};
void PCSqueue::push(task *ref){
EnterCriticalSection(&access);
objectQueue->push_front(ref);
LeaveCriticalSection(&access);
ReleaseSemaphore(queueSema,1,NULL);
};
bool PCSqueue::pop(task **ref,DWORD timeout){
if (WAIT_OBJECT_0==WaitForSingleObject(queueSema,timeout)) {
EnterCriticalSection(&access);
*ref=objectQueue->back();
objectQueue->pop_back();
LeaveCriticalSection(&access);
return(true);
}
else
return(false);
};
threadPool::threadPool(int initThreads){
queue=new PCSqueue();
for(threadCount=0;threadCount!=initThreads;threadCount++){
CreateThread(NULL,0,staticThreadRun,this,0,0);
};
};
void threadPool::submit(task *aTask){
aTask->myPool=this;
queue->push(aTask);
};