Es ist ziemlich einfach. Sie benötigen einige Klassen:
Task-Klasse mit einer "run" -Methode - etwas für den Pool-Benutzer zu überschreiben, um ihre eigenen Aufgaben aufzubauen.
Ein Producer-Consumer-ObjektQueue für die Threads, die auf Arbeit warten. Wenn Sie std :: deque haben, ist das ziemlich einfach. Wenn nicht, müssen Sie Ihren eigenen Warteschlangentyp codieren. Neben der Queue-Klasse benötigen Sie noch weitere Synchro-Sachen, vielleicht einen CriticalSection/Mutex zum Schutz der Queue und einen Semaphor für die Threads, auf die gewartet werden soll.
Eine threadPool-Klasse - etwas, das die P-C-Queue enthält, submit (TaskClass aTask) -Methode und andere Sachen.
Ein Stapel von Threads, die im threadPool ctor erstellt wurden - verwenden Sie CreateThread und übergeben Sie die threadPool-Instanz als lpParam-Parameter, damit die Threads sie wieder zurückwerfen können, um Zugriff auf den threadPool zu erhalten.
Die Fäden warten auf die threadPool-> objectQueue für die Arbeit, zB:
// 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);
};
Re: „Gibt es eine Möglichkeit zu schaffen, ein Threadpool nur mit C++ - oder Windows C++ - Funktionen? ". Ja. Wie denkst du, dass jede einzelne Thread-Pool-Bibliothek auf der Erde funktioniert? Keiner von ihnen hat einen speziellen Zugriff auf das Betriebssystem oder den Compiler, noch benötigen sie es. Es ist aber nicht so trivial. –
Die gewünschte Funktion ist [CreateThread] (http://msdn.microsoft.com/en-us/library/bb202727.aspx). Siehe [hier] (http://msdn.microsoft.com/en-us/library/aa270957%28v=vs.60%29.aspx). –
@DavidSchwartz erstellt CreateThread keinen Thread-Pool. –