begin process at 2012 02 11 10:37:17
  Trouver un code source :
 
dans
 
Accueil > Forum > 

Archive C/C++

 > 

Archives

 > 

API

 > 

Probleme avec les threads en C++ sour linux


Derniers messages déposésPoser une question dans le forum ou lancer une discussion

Probleme avec les threads en C++ sour linux

jeudi 15 avril 2004 à 17:29:18 | Probleme avec les threads en C++ sour linux

benjamvs

Bonjour,
j'ai le probleme suivant a regler en C++
je travaille sur les threads sous linux, avec la librairie "pthread"
Lorsque je crée un thread, celui ci doit exectuer une fonction membre d'un classe mais Ce n'est pas ce

point là qui me pose probleme. Le soucis est que cette fonction membre qui doit etre lancé prend en

parametre des attributs d'une autre classe, et me renvoie en fin de triatement un pointeur sur une

classe encore différente, et ce sont ces deux dernieres chose que je ne parvient pas a faire. C'est à

dire que je ne sais pas comment envoyer à ma fonction les parametres en entrée, ni comment recuperer mon

resultat.

Pour appeller ma fonction membre je procede de la maniere suivante :

class pairint{
public:
pairint(int, int);
~pairint() {};
void add();
void printpair();
private:
int _x;
int _y;
};

pairint::pairint(int x, int y) {
_x = x;
_y = y;
};

void pairint::add() {
cout << "sum of pair is "<< _x+_y << "\n";
};

void pairint::printpair() {
cout << "value of x is " << _x << "\n";
cout << "value of y is " << _y << "\n";
};

extern "C" void *ThreadStartup(void *);

int main(int argc, char **argv)
{
pairint *t=NULL;
pthread_t thread;
int rc;

t = new pairint(5,10);

rc = pthread_create(&thread, NULL, ThreadStartup, (void *)t);
if (rc) {
cout << "Failed to create a thread" << "\n";
exit(EXIT_FAILURE);
}

printf("Waiting for thread to complete\n");
rc = pthread_join(thread, NULL);
if (rc) {
cout << "Failed to joint a thread" << "\n";
exit(EXIT_FAILURE);
}
exit(EXIT_SUCCESS);
}


void *ThreadStartup(void *_tgtObject) {
pairint *tgtObject = (pairint *)_tgtObject;
tgtObject->add();
delete tgtObject;
return (NULL);
}


Ici c'est un exemple simple. Mais ce que je cherche a faire, c'est passer des arguments a la fonction

ThreadStartup qui n'appartiennent pas a la classe "pairint". Et je voudrais aussi recuperer un pointeur

sur une classe en retour.
Voila, si quelqu'un a une idée je le remercie par avance.
samedi 17 avril 2004 à 01:54:30 | Re : Probleme avec les threads en C++ sour linux

jsonor

Bonjour monsieur Benjamvs :) , ca roule ?..bref, c pas le lieu pour tapper la causet' .

Alors en fait, ton problème repose sur le principe des membres statiques des classes.
En effet, les fonctions threads doivent être déclarées en tant que membres statiques de classes (car elles ne peuvent pas être instanciées) ou bien en tant que fonction toute bête (dans un header par ex.). Si c'est seulement déclaré en membre normal, ca plantera à la compilation.
Ensuite, le typage de ces fonctions de threads est batard (c du void*), de même, il n'y a qu'un seul paramètre possible qui est aussi en void*. Mais c'est un avantage car tu peux le "caster" en ce que tu veux.

Donc pour revenir à ton exemple, le début est bon pour passer un paramètre à ton thread :

pthread_t thread;
int rc;
pairint *t = new pairint(5,10);
rc = pthread_create(&thread, NULL, ThreadStartup, (void *)t);
if (rc) {
cout << "Failed to create a thread" << "\n";
exit(EXIT_FAILURE);
}

Dans ce bout de code, tu transmets par le 4ème paramètre de la fonction pthread_create le paramètre de la fonction de thread "ThreadStartup". D'ailleurs, tu l'as casté en void*, ce qu'il faut faire.

Ensuite, pour récuperer le retour de la fonction, tu es obligé de mettre ton thread en "join", ce qui a pour conséquence de bloquer ton thread parent jusqu'à ce que le thread fils soit terminé. Ca perd beaucoup de l'intérêt des threads si tu veux faire un programme avec des threads travaillant vraiment en //. Enfin toujours est il que c'est le deuxième paramètre de ta fonction pthread_join qui pointera vers ton retour de fonction de thread (là, fo le caster en void**). Pour reprendre ton exemple en le modifiant :

printf("Waiting for thread to complete\n");
CMaClasse* retourThread;
rc = pthread_join(thread, (void**)retourThread);
/* a ce stade, tu peux accéder à retourThread qui pointera sur ta valeur de retour */
-----------
void *ThreadStartup(void *_tgtObject) {
pairint *tgtObject = (pairint *)_tgtObject;
tgtObject->add();
delete tgtObject;
CMaClasse* retourThread
return (void*)retourThread;
}



Voilà en gros...mais le mieux, si tu ne veux pas avoir un thread fils bloquant le thread père, tu peux passer par des variables globales (par exemple des variables statiques de classe.aussi). Tu peux d'ailleurs utiliser ce principe pour les paramètres aussi. (j'aime les membres statiques je sais )

Voilà p'tit Ben, et pas trop de Q3 pdt les h de repos

@+
Jérôme


Cette discussion est classée dans : fonction, int, probleme, classe, pairint


Répondre à ce message

Sujets en rapport avec ce message

Pointeur vers une fonction dans une classe ... [ par MoDDiB ] Supposons que j'ai la fonctionvoid Fonction(int test,int t);appartenant a la classe Cclass.Quelle est la syntaxe pour creer un pointeur vers cette fon adresse d'une fonction membre d'une classe [ par gagah1 ] Salut à tous!Je voudrais avoir l'adresse mémoire d'une fonction membre d'une classe, alors que l'ISO C++ l'interdire l'accès.Je m'explique:J'ai une c probleme avec une fonction de log [ par erazor ] bonjourvoila, mon probleme est le suivant: je suis en train de programmer un jeu de stratégie temps réel afin de me former a la prog en cpp et afin d' (__cdecl *) => kesako? [ par Oeil_de_taupe ] Bonjour tout le monde, J'ai créé deux classes qui représentent un protocole pour envoyer des données entre deux PC. Lors de l'appele de leur construc Surcharge de l'opérateur << [ par kenjimax ] Bonjour à tous, Je rencontre un petit probleme avec la surcharge de l'opérateur <<. Dans une classe mere, je veux afficher les caractéristiques d'un probleme de dll [ par lamoueste ] j'ai un probleme avec ma dll : il s'agit d'une fonction qui doit lance une fenetre (dialog box ) en modal mais j'ai une "assertion failed" :( et je ne probleme structure et fonction [ par yanne1985 ] salutj'ai lcode suivanttypedef struct{    int n;   //......}essai;void miseZero(type **un_type){    (*un_type)->n=0;}int main(){    type *un_type;    Probleme passage tab** de fonctions a fonction. [ par Nitrakz ] Bonjour tous le monde ! Comme l'explique le titre j'ai un petit soucis pour passer un tableaux a 2 dimensions tab[i][j] d'une fonction a une autre. Probleme pour integrer Upload Ftp ^^' [ par inf12 ] Bonjour tous le monde j'ai un soucis avec ce code  ^^' :#include int test(netbuf *conn){                char* serveur = "ftp.tonserveur.com";        c Erreur lors d'un ajout de classe [ par bedrohung ] Bonsoir, je débute sur le C++ et je travaille sur un projet d'envoie de SMS via un modem GSM. J'utilise une classe liaison série pour communiquer avec


Nos sponsors


Sondage...

Comparez les prix

CalendriCode

Février 2012
LMMJVSD
  12345
6789101112
13141516171819
20212223242526
272829    

Consulter la suite du CalendriCode

 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 2,496 sec (4)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales