IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

POSIX C Discussion :

Envoie de données depuis un thread


Sujet :

POSIX C

  1. #1
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    février 2019
    Messages
    38
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 21
    Localisation : Canada

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : février 2019
    Messages : 38
    Points : 40
    Points
    40
    Par défaut Envoie de données depuis un thread
    Salut je lis un cour sur la programmation système en C, Depuis hier je traine sur un exercice sur les thread que voici:
    Écrire un programme qui crée un thread qui alloue un tableau d’entiers,
    initialise les éléments par des entiers aléatoires entre 0 et 99, et retourne le tableau d’entiers.

    Le problème est que je n'arrive pas lire la variable renvoyer par le thread je tombe sur cette erreur dans la console au moment de l'affichage des valeur du tableau via printf :
    $ zsh: segmentation fault

    Voice le code que j'ai écris:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
     
    #include <stdio.h>
    #include <stdlib.h>
    #include <errno.h>
    #include <pthread.h>
     
    void *maFontion(void*arg)
    {
        int tableau[10]={0};
        printf("On est dans le thread, on initialise le tableau par des valeur aléatoire\n");
        for (int i = 0; i < 10; i++)
        {
            tableau[i]= rand()%99;
        }
     
        pthread_exit((void*)tableau);
    }
     
    int main(void)
    {
        pthread_t monThread;
        int *tableau =NULL;
     
        if(pthread_create(&monThread,NULL,maFontion,NULL) != 0)
        {
            perror("pthread_create");
            exit(-1);
        }
     
        pthread_join(monThread,(void*)&tableau);
     
        printf("On est dans le main on lit la valeur de tableau\n");
        for (int i = 0; i < 10; i++)
        {
            printf("Valeur numero %d => %d\n", i , tableau[i]);
        }
     
        return 0;
    }
    Je pense que c'est lier à la manière dont j'utilise les pointeur vu le message d'erreur (zsh: segmentation fault), mais je n'arrive pas à corriger l'erreur j'ai même essayer avec une simple variable au lieu d'un tableau mais .
    merci d'avance.

  2. #2
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    juin 2010
    Messages
    6 771
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : juin 2010
    Messages : 6 771
    Points : 31 043
    Points
    31 043
    Billets dans le blog
    4
    Par défaut
    tableau est interne à la fonction et ne survit pas à la sortie de fonction, encore moins à une fin de thread.
    Pensez à consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation réseau ?
    Aucune aide via MP ne sera dispensée. Merci d'utiliser les forums prévus à cet effet.

  3. #3
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    février 2019
    Messages
    38
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 21
    Localisation : Canada

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : février 2019
    Messages : 38
    Points : 40
    Points
    40
    Par défaut
    Citation Envoyé par Bousk Voir le message
    tableau est interne à la fonction et ne survit pas à la sortie de fonction, encore moins à une fin de thread.
    comment puis-je faire pour envoyer une donnée alors? Parce que l'exercice dit de que ce le thread qui crée le tableau et l'initialise avant de le retourner. En plus dans le cour un exemple est donné ou une variable est créer et initialiser dans le thread avant d'être retourner , peut-être que c'est une erreur de la part du rédacteur.

  4. #4
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    juin 2010
    Messages
    6 771
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : juin 2010
    Messages : 6 771
    Points : 31 043
    Points
    31 043
    Billets dans le blog
    4
    Par défaut
    Quel est le code réel que tu lis ?
    Tu peux retourner un pointeur, s'il est alloué et continue donc d'exister en dehors de la pile.
    Pensez à consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation réseau ?
    Aucune aide via MP ne sera dispensée. Merci d'utiliser les forums prévus à cet effet.

  5. #5
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    février 2019
    Messages
    38
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 21
    Localisation : Canada

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : février 2019
    Messages : 38
    Points : 40
    Points
    40
    Par défaut
    Dans ce cas je pense que ça devrais marche alors parcequ'en C les tableaux sont un peut comme des pointeurs non ?
    d'ailleurs j'ai essayer mais je n'y arrive pas s'il vous plait pouvez me donnée un exemple concret dans un code ou un thread retourne un tableau par exemple?
    Merci d'avance.

  6. #6
    Expert éminent
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    décembre 2015
    Messages
    1 303
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement matériel électronique
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : décembre 2015
    Messages : 1 303
    Points : 6 357
    Points
    6 357
    Par défaut
    Citation Envoyé par Sitatech Voir le message
    Dans ce cas je pense que ça devrais marche alors parcequ'en C les tableaux sont un peut comme des pointeurs non ?
    d'ailleurs j'ai essayer mais je n'y arrive pas s'il vous plait pouvez me donnée un exemple concret dans un code ou un thread retourne un tableau par exemple?
    Merci d'avance.
    Non.
    Le nom d'un tableau revient à un pointeur sur le début d'un tableau. Mais le tableau existe bien quelque part. Et dans ton cas, il existait dans la fonction et a disparu. Il ne nous reste que le pointeur qui pointe sur un objet disparu!

    Une fonction (thread ou pas thread) ne peut pas retourner un tableau. Quelques moyens pour une fonction seraient :
    - lui passer en paramètre l'adresse d'un buffer à remplir (et on doit s'assurer que le durée de vie du buffer est supérieure à le durée de vie du thread et elle reste valide pour le thread qui devra traiter la réponse.)
    - la fonction et/ou le thread peut faire une allocation dynamique, et comme un thread peut dans ton cas retourner un pointeur, il peut retourner l'adresse de cette mémoire allouée.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    const int SIZE = 10;
     
    void* maFonction(void*arg)
    {
        int* tableau = malloc( SIZE * sizeof*tableau );  // allocation dynamique
        printf("On est dans le thread, on initialise le tableau par des valeur aléatoire\n");
        for (int i = 0; i < SIZE ; i++)  {
            tableau[i]= rand()%100;
        }
     
        pthread_exit( tableau );
    }
    ... ...
        pthread_join( monThread, (void*)&tableau );
        if ( tableau ) {
            printf("On est dans le main on lit la valeur de tableau\n");
            for ( int i = 0 ; i < SIZE ; i++ )
                printf( "Valeur numero %d => %d\n", i , tableau[i] );
     
            free( tableau ); // libérer le tableau après utilisation
        }
    ... ...

  7. #7
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    février 2019
    Messages
    38
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 21
    Localisation : Canada

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : février 2019
    Messages : 38
    Points : 40
    Points
    40
    Par défaut
    Merci à vous , il faut vraiment que je cherche un cour d'approfondissement sur les pointeur.
    Résolu

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 0
    Dernier message: 21/04/2014, 17h22
  2. [QThread] Thread d'acquisition de données depuis carte PCI
    Par alexgille dans le forum Multithreading
    Réponses: 19
    Dernier message: 11/02/2011, 17h14
  3. Envoi d'évènement depuis un thread
    Par Natrio dans le forum C#
    Réponses: 5
    Dernier message: 10/09/2010, 12h17
  4. Réponses: 8
    Dernier message: 29/06/2008, 23h47
  5. envoie de donnée dans une requéte depuis un liste déroulante
    Par steve o'steen dans le forum Langage
    Réponses: 1
    Dernier message: 17/10/2006, 16h24

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo