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 

Votre réponse

2 réponses

Meilleure réponse
cptpingu 3827 Messages postés dimanche 12 décembre 2004Date d'inscription 6 octobre 2018 Dernière intervention - 24 juil. 2011 à 13:06
3
Merci
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

Merci cptpingu 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 101 internautes ce mois-ci

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
Merci
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.