L'Événement / La Tâche De La File D'Attente De Multithreading C++

Je voudrais créer une classe dont les méthodes peuvent être appelées à partir de plusieurs threads. mais au lieu de l'exécution de la méthode du fil à partir de laquelle il a été appelé, il doit procéder à tous dans son propre thread. Aucun résultat ne doit être renvoyé, et Il ne devrait pas bloquer le thread appelant.

Une première tentative de mise en Œuvre, j'ai inclus ci-dessous. Les méthodes publiques insérer un pointeur de fonction et les données dans une File d'attente de travail, qui le thread de travail prend alors la. Cependant, il n'est pas particulièrement joli code et ajouter de nouvelles méthodes, c'est encombrant.

Idéalement, je voudrais l'utiliser comme une classe de base qui je peux facilement ajouter des méthodes (avec un nombre variable d'arguments) avec un minimum de tracas et de la duplication de code.

Quelle est la meilleure façon de le faire? Est il un code qui fait la même chose? Grâce

#include <queue>
using namespace std;
class GThreadObject
{
class event
{
public:
void (GThreadObject::*funcPtr)(void *);
void * data;
};
public:
void functionOne(char * argOne, int argTwo);
private:
void workerThread();
queue<GThreadObject::event*> jobQueue;
void functionOneProxy(void * buffer);
void functionOneInternal(char * argOne, int argTwo);
};
#include <iostream>
#include "GThreadObject.h"
using namespace std;
/* On a continuous loop, reading tasks from queue
* When a new event is received it executes the attached function pointer
* It should block on a condition, but Thread code removed to decrease clutter
*/
void GThreadObject::workerThread()
{
//New Event added, process it
GThreadObject::event * receivedEvent = jobQueue.front();
//Execute the function pointer with the attached data
(*this.*receivedEvent->funcPtr)(receivedEvent->data);
}
/*
* This is the public interface, Can be called from child threads
* Instead of executing the event directly it adds it to a job queue
* Then the workerThread picks it up and executes all tasks on the same thread
*/
void GThreadObject::functionOne(char * argOne, int argTwo)
{
//Malloc an object the size of the function arguments
int argumentSize = sizeof(char*)+sizeof(int);
void * myData = malloc(argumentSize);
//Copy the data passed to this function into the buffer
memcpy(myData, &argOne, argumentSize);
//Create the event and push it on to the queue
GThreadObject::event * myEvent = new event;
myEvent->data = myData;
myEvent->funcPtr = &GThreadObject::functionOneProxy;
jobQueue.push(myEvent);
//This would be send a thread condition signal, replaced with a simple call here
this->workerThread();
}
/*
* This handles the actual event
*/
void GThreadObject::functionOneInternal(char * argOne, int argTwo)
{
cout << "We've made it to functionTwo char*:" << argOne << " int:" << argTwo << endl;
//Now do the work
}
/*
* This is the function I would like to remove if possible
* Split the void * buffer into arguments for the internal Function
*/
void GThreadObject::functionOneProxy(void * buffer)
{
char * cBuff = (char*)buffer;
functionOneInternal((char*)*((unsigned int*)cBuff), (int)*(cBuff+sizeof(char*)));
};
int main()
{
GThreadObject myObj;
myObj.functionOne("My Message", 23);
return 0;
}

OriginalL'auteur Ben Reeves | 2009-05-29