problème passage paramètre pthread_create ?

problème passage paramètre pthread_create ? - C - Programmation

Marsh Posté le 16-08-2004 à 10:43:02    

Je dois utilisé pthread_create :
 
int pthread_create(pthread_t * thread, pthread_attr_t * attr, fonction, arguments);  
 
 
j'ai une fonction qui prend 4 arguments et je dois passé cette fonction dans pthread_create mais je sais pas comment faire pour passé la fonction et les 4 arguments.
 
 

Code :
  1. void fonction(int i, char c[], int d, int f)
  2. {
  3.    .......
  4. }
  5. for(t=0;t < nb_thread;t++)
  6. {
  7.    printf("Creating thread No %d\n", t);
  8.    rc = pthread_create(&thread[t], &attr, fonction, ????); 
  9.    if (rc)
  10.    {
  11.       printf("ERROR; return code from pthread_create() is %d\n", rc);
  12.       exit(-1);
  13.    }
  14. ...


 
 
Merci.


Message édité par manson69 le 16-08-2004 à 10:43:40
Reply

Marsh Posté le 16-08-2004 à 10:43:02   

Reply

Marsh Posté le 16-08-2004 à 10:55:16    

moi je ferais comme ça :  
 
- création d'une structure contenant tes arguments :

Code :
  1. typedef struct {
  2.    int i;
  3.    char c[];
  4.    int d;
  5.    int f;
  6. } args;


 
ensuite une petite fonction wrapper qui va bien (pour encapsuler ta fonction thread et la structure) :

Code :
  1. int wrapper (args *arglist)
  2. {
  3.    fonction(arglist->i, arglist->c, arglist->d, arglist->f);
  4.    free(arglist);
  5. }


 
- et enfin, le main :

Code :
  1. int main (int argc, char **argv)
  2. {
  3.    args *arglist = malloc(sizeof(args));
  4.    // remplir la structure arglist
  5.    arglist->i = xxx;
  6.    arglist->c = xxx;
  7.    [...]
  8.    rc = pthread_create(&thread[t], &attr, wrapper, arglist);
  9.    [...]
  10. }


vala [:god]


Message édité par Harkonnen le 16-08-2004 à 10:57:23
Reply

Marsh Posté le 16-08-2004 à 11:24:20    

bof, c'est incorrect au niveau des types. 2 secondes je recherche mon exemple

Reply

Marsh Posté le 16-08-2004 à 11:26:28    

http://forum.hardware.fr/forum2.ph [...] 877&cat=10


Message édité par Taz le 16-08-2004 à 11:26:58
Reply

Marsh Posté le 18-08-2004 à 16:05:20    


Merci.
 
J'aurais encore voulu savoir un truc.
voila j'ai ma fonction qui prend une structure.
J'aimerais retourné une chaine de caractère.
 

Code :
  1. void* fonction(void *p)
  2. {
  3.     struct MyArgs *args = p;
  4.     /* code de la fonction */
  5.     char chaine[20];
  6.     pthread_exit((void *) 0);
  7. }


 
Est ce que la valeur de retour je peut la mettre dans : pthread_exit(chaine);
 
voila ce que je fais après pour la fin des threads :
 
 

Code :
  1. for(t=0;t < nb_thread;t++)
  2. {
  3.    rc = pthread_join(thread[t], (void **)&status);
  4.    if (rc)
  5.    {
  6.       printf("ERREUR : phtread_join() return code = %d\n", rc);
  7.       exit(-1);
  8.    }
  9.    printf("Thread %d status= %d\n",t, status);
  10. }


 
La valeur de retour, elle correspondrait à status ? Comment la récupérer ?
Je n'arrive pas à retourné la chaine.
 
Merci.

Reply

Marsh Posté le 19-08-2004 à 10:37:24    

up ...

Reply

Marsh Posté le 19-08-2004 à 10:42:25    

on retourne JAMAIS de tableau.
 
essaye p-e avec une allocation dynamique ... (je connais mal les pthread)


---------------
-( BlackGoddess )-
Reply

Marsh Posté le 19-08-2004 à 10:56:41    

BlackGoddess a écrit :

on retourne JAMAIS de tableau.

faux. on ne retourne jamais une référence à une variable locale.

BlackGoddess a écrit :


essaye p-e avec une allocation dynamique ... (je connais mal les pthread)

y a aucun problème

Reply

Marsh Posté le 19-08-2004 à 10:57:41    

bin un tableau est forcément local non ?


---------------
-( BlackGoddess )-
Reply

Marsh Posté le 19-08-2004 à 11:01:02    

non ce que je veux dire c'est qu'on pourrait te passer quelque chose (pointeur, référence, etc) en argument, à ce moment là tu peux le retourner au contexte appelant sans problème

Reply

Marsh Posté le 19-08-2004 à 11:01:02   

Reply

Marsh Posté le 19-08-2004 à 11:03:07    

ok je vois ce que tu veux dire


---------------
-( BlackGoddess )-
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed