• # espace utilisateur

    Posté par . En réponse au message probleme avec le fonctionnement d'un thread. Évalué à 4. Dernière modification le 13 octobre 2019 à 15:39.

    D'apres ce que j'ai compris des threads, c'est qu'ils font partie du meme processus

    Oui, ils vivent dans le même espace mémoire virtuel.

    mais ils possedent chacun leurs propres piles (stack).

    Oui, allouées dans cet espace.

    Donc les Threads peuvent lire des variables dans le tas ou dans la zones ou sont stockés les variables globales,

    De fait, ils peuvent lire des variables allouées dans l'espace mémoire dédié au processus.

    mais il n'est pas possible de lire une variable dans la pile d'un autre thread sans déclencher un segfault.

    Ah ? D'où tenez vous cette assertion ?

    Votre programme, qui est tout à fait valide, est la preuve du contraire.

    Le risque avec les threads est de mal maîtriser les flux d’exécution et de demander à accéder à une variable qui a été libérée, que soit parce qu'elle était dans le scope d'un thread qui s'est terminé ou parce qu'elle a été libérée explicitement.

    Et même là, le risque de segfault est faible, vous allez probablement taper dans un espace toujours réservé pour votre processus. Par contre, pour ce qui est de la valeur que vous allez récupérer, ça dépendra du sens du vent.

    #include <stdio.h>
    #include <stdlib.h>
    #include <pthread.h>
    #include <unistd.h>
    void* g(void * arg)
    {
     int value = *((int*)arg);
     sleep(2);
     fprintf(stdout, "thread g : &value = %p ; value = %i\n", arg, value);
     return NULL;
    }
    void* f(void * arg)
    {
     pthread_t t;
     int value = *((int*)arg);
     pthread_create( &t, NULL, g, (void*)&value);
     sleep(1);
     fprintf(stdout, "thread f: &value = %p ; value = %i\n", arg, value);
     printf("bye thread f\n");
     return NULL;
    }
    int main(int argc, char const *argv[])
    {
     pthread_t t;
     int *value = malloc(sizeof (int));
     *value=6;
     printf("&value = %p ; value = %i\n", value , *value);
     pthread_create( &t, NULL, f, value);
     free(value);
     value=NULL;
     printf("value freed\n");
     pthread_join( t, NULL );
     sleep(5);
     return 0;
    }