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 averti
    Homme Profil pro
    �tudiant
    Inscrit en
    F�vrier 2019
    Messages
    38
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 25
    Localisation : Canada

    Informations professionnelles :
    Activit� : �tudiant

    Informations forums :
    Inscription : F�vrier 2019
    Messages : 38
    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
    7 153
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 38
    Localisation : Canada

    Informations professionnelles :
    Activit� : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 153
    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 averti
    Homme Profil pro
    �tudiant
    Inscrit en
    F�vrier 2019
    Messages
    38
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 25
    Localisation : Canada

    Informations professionnelles :
    Activit� : �tudiant

    Informations forums :
    Inscription : F�vrier 2019
    Messages : 38
    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
    7 153
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 38
    Localisation : Canada

    Informations professionnelles :
    Activit� : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 153
    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 averti
    Homme Profil pro
    �tudiant
    Inscrit en
    F�vrier 2019
    Messages
    38
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 25
    Localisation : Canada

    Informations professionnelles :
    Activit� : �tudiant

    Informations forums :
    Inscription : F�vrier 2019
    Messages : 38
    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 confirm�
    Homme Profil pro
    Ing�nieur d�veloppement mat�riel �lectronique
    Inscrit en
    D�cembre 2015
    Messages
    1 599
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 62
    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 599
    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 averti
    Homme Profil pro
    �tudiant
    Inscrit en
    F�vrier 2019
    Messages
    38
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 25
    Localisation : Canada

    Informations professionnelles :
    Activit� : �tudiant

    Informations forums :
    Inscription : F�vrier 2019
    Messages : 38
    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. 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