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

eustatika 16 Messages postés lundi 20 octobre 2008Date d'inscription 30 août 2011 Dernière intervention - 24 juil. 2011 à 10:39 - Dernière réponse : eustatika 16 Messages postés lundi 20 octobre 2008Date d'inscription 30 août 2011 Dernière intervention
- 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
Afficher la suite 

2 réponses

Répondre au sujet
cptpingu 3785 Messages postés dimanche 12 décembre 2004Date d'inscription 18 avril 2018 Dernière intervention - 24 juil. 2011 à 13:06
+3
Utile
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
Cette réponse vous a-t-elle aidé ?  
Commenter la réponse de cptpingu
eustatika 16 Messages postés lundi 20 octobre 2008Date d'inscription 30 août 2011 Dernière intervention - 24 juil. 2011 à 14:07
0
Utile
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.
Commenter la réponse de eustatika

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.