Débutant C : Problème pour récupérer une valeur dans un thread

Résolu
eustatika Messages postés 16 Date d'inscription lundi 20 octobre 2008 Statut Membre Dernière intervention 30 août 2011 - 24 juil. 2011 à 10:39
eustatika Messages postés 16 Date d'inscription lundi 20 octobre 2008 Statut Membre Dernière intervention 30 août 2011 - 24 juil. 2011 à 14:07
Bonjour,
Je débute en C et suis actuellement bloqué lorsqu'il s'agit de renvoyer une valeur à la fin de l'exécution d'un thread.
Voici mon (tout) petit programme :
#include 
#include <stdio.h>
#include <stdlib.h>

#include <sys/types.h>
#include <time.h>
void *Chrono(void *arg);
int main()
{
    pthread_t threadIdent ;
    pthread_attr_t threadAttribut ;
    time_t timeC =NULL ;
    int retour;
    int *status ;
    int s ;

    s=pthread_create(&threadIdent,NULL, Chrono, (time_t*) timeC  ) ;

    pthread_join(threadIdent, (void *)status) ;
    printf("Thread terminé avec le status %d", status ) ;
    //Je souhaiterais ensuite utiliser la valeur de TimeC...


}


void *Chrono(void *arg)
{
    time_t currentTime;
    time_t startTime;

    time(&startTime) ;

    while(currentTime-startTime<3)
    {
        time(&currentTime) ;
    }

 arg = &currentTime ;

    pthread_exit(0) ;
}


En fait, lors de l'exécution de "*arg = ¤tTime ;", le compilateur me renvoie un "segmentation fault".
L'autre question que je me pose est : est-on obligé d'écrire la fonction à exécuter dans le thread avec le paramètre "void *arg", ne pourrait-on pas passer un pointeur vers un autre type.
D'après ce que j'ai vu non, mais je ne comprends pas pourquoi.

Merci d'avance à ceux qui auront la pitié de me répondre.
J'ai encore du mal avec les pointeurs

2 réponses

cptpingu Messages postés 3837 Date d'inscription dimanche 12 décembre 2004 Statut Modérateur Dernière intervention 28 mars 2023 123
24 juil. 2011 à 13:06
Effectivement, tu as des petits soucis avec les pointeurs !
Je t'invite à bien maîtriser ceux-ci, avant de te lancer dans le multithreading.

Autre petite chose, si ton but est juste de calculer le temps d'exécution d'un morceau de programme, tu n'as pas besoin de thread pour le faire.

Je te propose une correction de ton code (attention, elle n'est pas rigoureuse, je ne vérifie jamais les erreurs éventuelles):
#include 
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <time.h>

void* chrono(void *arg)
{
  time_t currentTime = 0;
  time_t startTime = 0;
  time_t* timeC = NULL;

  time(&startTime);
  time(&currentTime);

  while (currentTime - startTime < 3)
    time(&currentTime);

  timeC = arg;
  *timeC = currentTime;

  pthread_exit(0);
}

int main()
{
  pthread_t threadIdent;
  time_t timeC = 0;
  int status;
  int s;

  s = pthread_create(&threadIdent, NULL, chrono, &timeC);

  pthread_join(threadIdent, (void*)&status);
  printf("Thread terminé avec le status %d\n", status);
  printf("TimeC = %d\n", (int)timeC);
  /* Je souhaiterais ensuite utiliser la valeur de TimeC... */

  return 0;
}


Compilé avec:
gcc -W -Wall -ansi -pedantic -lpthread thread.c


________________________________________________________________________
Historique de mes créations, et quelques articles:
[ http://0217021.free.fr/portfolio http://0217021.free.fr/portfolio]
Merci d'utiliser Réponse acceptée si un post répond à votre question
3
eustatika Messages postés 16 Date d'inscription lundi 20 octobre 2008 Statut Membre Dernière intervention 30 août 2011
24 juil. 2011 à 14:07
Merci beaucoup.
Je crois que je vais faire une pause...
Je débute, certe mais quand je vois ça :
" arg = ¤tTime ;"
Je me prendrais presque en pitié.
J'étais tellement bloqué par l'idée de découvrir les thread que j'ai fait une erreur débile (pas qu'une mais celle là est plutôt classe)/

En fait, je faisais des test car je tente de programmer un petit gestionnaire d'évènements perso. J'empile dans un tableau et je traite dans le thread.
Enfin, la route est encore longue pour moi. Rien que perdre les mauvaises habitudes du VB.Net va me prendre quelques temps

Merci infiniment.

Je vais faire un sieste.
0
Rejoignez-nous