Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1897 connectés 

  FORUM HardWare.fr
  Programmation
  C++

  question sur les threads

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

question sur les threads

n°2091899
in_your_ph​ion
Posté le 28-07-2011 à 10:51:29  profilanswer
 

Bonjour
 
J'aurais une question sur les threads.  
 
Est-il exacte de dire que les threads partagent une même zone mémoire, qui est le tas et data (variables globales et statiques) ?
 
Par ailleurs, j'entends souvent aussi dire que les threads partagent le même espace d'adressage. Est-ce que espace d'addressage == tas ?
 
merci par avance!  
 

mood
Publicité
Posté le 28-07-2011 à 10:51:29  profilanswer
 

n°2091902
Un Program​meur
Posté le 28-07-2011 à 11:12:30  profilanswer
 

L'espace d'adressage est une notion de l'OS.  Elle désigne la mémoire qui est accessible et les adresses qui y correspondent.
 
Le tas et la pile désigne des notions du langage (et pour le tas il y a une notion differente en structure de donnee, pour la pile il y a une structure de donnee apparentee et souvent une notion du processeur encore plus apparentee).
 
L'espace d'adressage est commun entre deux threads, le tas aussi mais la pile non (mais les deux piles se retrouvent dans le meme espace d'adressage et dont peuvent etre modifiees par les deux threads, chaque thread a neanmoins sa pile et ne va pas toucher a celle de l'autre sauf si on lui passe un pointeur vers celle-ci -- ce qui est souvent une erreur et toujours fragile).


---------------
The truth is rarely pure and never simple (Oscar Wilde)
n°2091910
in_your_ph​ion
Posté le 28-07-2011 à 11:43:19  profilanswer
 

merci pour ta réponse.
 
Donc si j'ai bien compris, tout est dans l'espace d'adressage la pile et le tas compris.
 
Mais la pile n'est pas partagée par les thread, chacun ayant sa propre pile.
 
C'est ça ?
 
Dans ce cas, vaut-il mieux parler de mémoire partagée (car apparement ca pourrait préter à confusion) ou de segments mémoires partagés ?
 
merci

n°2091947
Un Program​meur
Posté le 28-07-2011 à 14:12:48  profilanswer
 

On peut partager de la memoire sans partager l'espace memoire.  L'espace memoire est un mapping adresse->emplacement memoire. Deux processus differents peuvent partager de la memoire sans que l'espace memoire soit le meme; la memoire partagee pouvant se retrouver a la meme adresse dans les deux espaces memoire ou a des adresses differentes).  Deux threads partagent leur espace memoire.


Message édité par Un Programmeur le 28-07-2011 à 14:13:06

---------------
The truth is rarely pure and never simple (Oscar Wilde)
n°2093352
in_your_ph​ion
Posté le 04-08-2011 à 17:13:09  profilanswer
 

salut,
ok, alors d'après ce que je comprend l'espace mémoire est une sorte de look-up table, c'est ça ?

 

donc les threads partagent cette zone qui contient tout un tas d'adresses, mais les segments mémoires à proprement parler vers lesquels pointent ces adresses de l'espace mémoire peuvent être les mêmes ... ou pas...

 

j'ai bon ? [:alberich]


Message édité par in_your_phion le 04-08-2011 à 17:13:48
n°2093357
theshockwa​ve
I work at a firm named Koslow
Posté le 04-08-2011 à 17:56:06  profilanswer
 

le seul truc qui devrait varier quand tu es du point de vue d'un thread ou d'un autre dans un même processus, ca devrait être le thread local storage.
 
L'addressage virtuel est géré par processus. C'est ce qui te permet notamment de partager tes pointeurs entre tes threads sans trop te poser de question alors que, bien évidemment, passer un pointeur à un autre processus n'a pas de sens.


---------------
last.fm
n°2093360
Un Program​meur
Posté le 04-08-2011 à 18:03:35  profilanswer
 

Les threads partagent tout. Les piles sont naturellement differentes mais sont accessibles aux autres threads.


---------------
The truth is rarely pure and never simple (Oscar Wilde)
n°2093414
in_your_ph​ion
Posté le 05-08-2011 à 02:04:31  profilanswer
 

theshockwave a écrit :

C'est ce qui te permet notamment de partager tes pointeurs entre tes threads


 
hello,
est ce que ce pointeur est partagé, même s'il est déclaré sur la pile...??
 
par exemple :
 

Code :
  1. void uneFonctionTraverseeParPlusieursThreads()
  2. {
  3.     int tab[] ={1,2,2,4,7,86,456786687646513,4552156};
  4.     int *a = tab; //a est il visible par tous les threads???
  5. }


 
merci

n°2093453
theshockwa​ve
I work at a firm named Koslow
Posté le 05-08-2011 à 11:23:54  profilanswer
 

houlà, tu pars de travers, là.
Quoi qu'il arrive, tes threads ont chacun une pile d'exécution, vu que ce sont précisément des fils d'exécution qui vont être différents. Le principe de pile devrait te faire réaliser que dans le code que tu as écrit, aucune de ces variables n'est prtagée, et pire encore, tu pourrais très bien avoir plusieurs instances de ton tableau et de ton pointeur pour un thread donné simplement si ce thread réentre dans ta fonction.
 
on va faire un exemple moche différent avec une statique moche et deux attentes actives moches, mais ca te donnera une idée :
 

Code :
  1. int* data = 0;
  2. size_t taille = 0;
  3. void FonctionPourThread1( bool surStack )
  4. {
  5.   if( surStack )
  6.   {
  7.     std::cout << "Thread1 : data sur stack." << std::endl;
  8.     int blah[] = { 31, 41, 59, 26, 53, 58, 97, 93, 23, 84, 62, 64, 33, 83, 27, 95 };
  9.     data = blah;
  10.     taille = sizeof( blah ) / sizeof( int );
  11.     while( data )
  12.     {}
  13.   }
  14.   else
  15.   {
  16.     std::cout << "Thread1 : data sur heap." << std::endl;
  17.     int* local = data = new int[ 20 ];
  18.     // remplissage de data
  19.     taille = 20;
  20.     while( data )
  21.     {}
  22.     delete local;
  23.   }
  24.   std::cout << "Thread1 : Le thread 2 a termine." << std::endl;
  25. }
  26. void FonctionPourThread2()
  27. {
  28.   std::cout << "Thread2 : en attente de data." << std::endl;
  29.   while( taille == 0)
  30.   {}
  31.   std::cout << "Thread2 : data dispo." << std::endl;
  32. // traitement
  33.   std::cout << "Thread2 : travail fini." << std::endl;
  34.   data = 0;
  35.   taille = 0;
  36. }


 
En général, on n'utilisera pas ce genre de fonctionnement. Tout système de thread te permet, lors du lancement du thread, de passer des informations de contexte (souvent sous la forme d'un void*) et du coup, les données que ton thread devra manipuler et partager avec d'autres lui seront accessibles au travers de ce contexte.


Message édité par theshockwave le 05-08-2011 à 11:24:49

---------------
last.fm
n°2093457
Un Program​meur
Posté le 05-08-2011 à 11:41:23  profilanswer
 

in_your_phion a écrit :


 
hello,
est ce que ce pointeur est partagé, même s'il est déclaré sur la pile...??
 
par exemple :
 

Code :
  1. void uneFonctionTraverseeParPlusieursThreads()
  2. {
  3.     int tab[] ={1,2,2,4,7,86,456786687646513,4552156};
  4.     int *a = tab; //a est il visible par tous les threads???
  5. }


 
merci


 
a est une variable locale, elle n'est accessible sous ce nom que par la fonction (et si il y a un appel recursif, chaque appel a sa variable, c'est aussi vrai si il y a plusieurs appels en meme temps par des threads differentes: chaque appel a sa variable).
 
Tu peux passer un pointeur vers a a une autre thread, elle pourra alors acceder a a a travers ce pointeur, tant que la fonction sera en cours d'execution. C'est en general une mauvaise idee.


---------------
The truth is rarely pure and never simple (Oscar Wilde)
mood
Publicité
Posté le 05-08-2011 à 11:41:23  profilanswer
 

n°2093486
in_your_ph​ion
Posté le 05-08-2011 à 14:32:19  profilanswer
 

@theshockwave : je regarde ça pour le programme ;) Merci, comment fait-on pour acceder à ce fameux contexte ?

 

ok, merci => donc pas vraiment accessible à moins de le vouloir explicitement

 

j'aurais une autre petite question sur les threads si ça ne te dérange pas trop

 

J'ai fait un petit programme multithread, c'est juste une boucle qui lance plusieurs threads qui affichent chacun la valeur d'un index d'un tableau. Le voici :

 
Code :
  1. #include <iostream>
  2. using namespace std;
  3. #include <pthread.h>
  4. struct data
  5. {
  6. const int * index;
  7. };
  8. pthread_mutex_t mutex;
  9. void * printNum(void * data_)
  10. {
  11. pthread_mutex_lock(&mutex);
  12. struct data * sData = (struct data*)data_;
  13. cout << "==> index=" << *sData->index << endl;
  14. sData->index++;
  15. pthread_mutex_unlock(&mutex);
  16.         return 0;
  17. }
  18. int main()
  19. {
  20. const int array[11] = {1,2,3,4,5,6,7,8,9,10,11};
  21. pthread_t threads[11];
  22. struct data sData;
  23. sData.index = array;
  24. pthread_attr_t attr;
  25. pthread_mutex_init(&mutex,0); 
  26. pthread_attr_init(&attr);
  27. pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_JOINABLE);
  28. for (int i=0; i<11; ++i )
  29. {
  30.  pthread_create(threads+i,&attr,printNum,&sData);
  31. }
  32. for (int i=0; i<11; ++i)
  33.  pthread_join(*(threads+i),(void**)0);
  34. cout <<"all done." << endl;
  35. return 0;
  36. }
 

Dans la fonction printNum => est ce qu'on est obligé de faire un lock/unlock si on veut afficher la valeur de chaque index du tableau par chacun des threads ? Y'a til une autre solution ..? car du coup je vois pas trop l'intérêt de paralléliser ce genre de traitement avec des lock/unlock quasiement tout le temps ...
Merci par avance


Message édité par in_your_phion le 05-08-2011 à 14:45:50
n°2093491
Un Program​meur
Posté le 05-08-2011 à 14:52:15  profilanswer
 

Tes differentes threads modifient le meme objet, il faut les synchroniser.
 
Pour le crash, *threads+i signifie (*threads)+i et pas *(threads+i) qui est ce qu'il faudrait (et qui s'ecrit plus simplement threads[i]).


---------------
The truth is rarely pure and never simple (Oscar Wilde)
n°2093505
in_your_ph​ion
Posté le 05-08-2011 à 15:44:05  profilanswer
 

Un Programmeur a écrit :

Tes differentes threads modifient le meme objet, il faut les synchroniser.

 

Pour le crash, *threads+i signifie (*threads)+i et pas *(threads+i) qui est ce qu'il faudrait (et qui s'ecrit plus simplement threads[i]).

 

oups, désolé effectivement j'ai vu l'erreur pour thread+i, merci

 

hum, ok donc on est obligé de mettre du mutex ...

 

Pari ailleurs, dans la boucle quand on crée les threads, en fait ils ne se lancent pas tous vraiment au même moment non ?

 

sinon je suis toujours intéressé par cette histoire de contexte. J'en entend souvent parler mais je le vois jamais ... On peut y accéder quelque part ? C'est l'OS qui gère les contextes ?

Message cité 2 fois
Message édité par in_your_phion le 05-08-2011 à 18:54:05
n°2122138
in_your_ph​ion
Posté le 18-01-2012 à 16:50:46  profilanswer
 

uuupp'z...

n°2122154
mrbebert
Posté le 18-01-2012 à 17:28:58  profilanswer
 

in_your_phion a écrit :

oups, désolé effectivement j'ai vu l'erreur pour thread+i, merci
 
hum, ok donc on est obligé de mettre du mutex ...
 
Pari ailleurs, dans la boucle quand on crée les threads, en fait ils ne se lancent pas tous vraiment au même moment non ?
 
sinon je suis toujours intéressé par cette histoire de contexte. J'en entend souvent parler mais je le vois jamais ... On peut y accéder quelque part ? C'est l'OS qui gère les contextes ?

Ce qu'il faut comprendre, c'est qu'un programme s'exécute dans une enveloppe qu'on appelle processus. Les adresses sont locales à ce processus (le processeur et l'OS faisant la conversion pour aller chercher les données dans la mémoire physique).
Il y a au moins un thread (c'est ce qui fait qu'il y a de la vie dans le processus) mais, lorsque tu en crée d'autres, ceux-ci s'exécutent dans le même processus, donc partagent le même espace mémoire :)


---------------
Doucement le matin, pas trop vite le soir.
n°2122210
theshockwa​ve
I work at a firm named Koslow
Posté le 19-01-2012 à 02:31:28  profilanswer
 

in_your_phion a écrit :


 
oups, désolé effectivement j'ai vu l'erreur pour thread+i, merci
 
hum, ok donc on est obligé de mettre du mutex ...
 
Pari ailleurs, dans la boucle quand on crée les threads, en fait ils ne se lancent pas tous vraiment au même moment non ?
 
sinon je suis toujours intéressé par cette histoire de contexte. J'en entend souvent parler mais je le vois jamais ... On peut y accéder quelque part ? C'est l'OS qui gère les contextes ?


 
 
Pour les contextes, si ce sont ceux que je mentionnais, c'est pas "géré" par l'OS, c'est juste ton API qui te permet de passer une valeur arbitraire à ton thread. Généralement, cette valeur arbitraire va être un pointeur vers un contexte que tu auras toi-même mis en place et que tu sauras utiliser dans ton thread.
 
Pour la création des threads instantanés, tu ne peux pas supposer plus que ce que ton API système te propose. Souvent, ton appel système qui demande la création du thread ne va pas être instantané (comprendre : quand tu sors de ton appel système, ton thread n'a pas nécessairement exécuté le moindre bout de code de la fonction que tu lui as passée en argument). Cela dit, selon le nombre de threads que tu crées, tu vas probablement tomber dans le cas où le premier thread a démarré avant que tu n'aies demandé la création du dernier.
 
Bref, ce sont des suppositions que tu ne dois pas faire. Si tu dois faire de la synchro sur le départ des threads, tout système va te proposer une API claire pour te mettre en attente de signaux spécifiques. Selon ton cas, tu pourras donc vouloir que tes threads soient créés dans un état dormant et les réveiller plus tard, ou alors tu pourras vouloir les faire attendre un signal en guise de première instruction (ou, dernier cas, tu les lances et tu t'en fous, ils peuvent tourner et faire le job sans que tu ne te poses de question :p)
 


---------------
last.fm

Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C++

  question sur les threads

 

Sujets relatifs
Question Visual C++Une question de QCM
petite question html de rien du tout :)Question sur un thème Tumblr, une div qui décale tout
Une question peut être bête : reconnaitre nombre binaire[java] Petite question sur les threads
Threads - 1 autre question sur interface graphiquepetite question sur les threads
[java] question sur les threads[java] question sur les threads
Plus de sujets relatifs à : question sur les threads


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR