processus - C++ - Programmation
Marsh Posté le 04-07-2002 à 12:06:33
Gaspard a écrit a écrit : Bonjour, Comment je peux faire pour qu'un processus père puisse avoir accès à un tableau de caractères dont le propriétaire est son processus fils? |
mets ce tableau dans un segment de shared memory...
Marsh Posté le 04-07-2002 à 12:08:48
une bonne claque dans la gueule et le problème est réglé
Marsh Posté le 04-07-2002 à 13:52:44
BENB, pour le segment de mémoire partagée, si j'ai bien compris il faut que j'utilise qqch comme shmget()
Marsh Posté le 04-07-2002 à 13:57:26
Gaspard a écrit a écrit : BENB, pour le segment de mémoire partagée, si j'ai bien compris il faut que j'utilise qqch comme shmget() |
Il y a beaucoup plus simple : les threads POSIX.
man pthread_create
Marsh Posté le 04-07-2002 à 14:37:37
J'ai pas envie de refaire tout mon programme en utilisant des thread plutôt que des processus alors je pense que je vais faire ce que me conseille BENB
Marsh Posté le 04-07-2002 à 14:38:17
Gaspard a écrit a écrit : J'ai pas envie de refaire tout mon programme en utilisant des thread plutôt que des processus |
Bah rien ne t'empêche de mélanger les deux...
Marsh Posté le 04-07-2002 à 15:59:01
joce a écrit a écrit : une bonne claque dans la gueule et le problème est réglé |
Faut mettre des chaussettes.
Marsh Posté le 04-07-2002 à 18:10:28
Jar Jar a écrit a écrit : Il y a beaucoup plus simple : les threads POSIX. man pthread_create |
Non au contraire... C'est bien plus compliqué avec des Threads...
La au moins il n'y a que le segment de memoire où il peut a avoir conflit d'acces, il n'y a aucun Pb de reponse à un signal, etc...
Contrairement a bcp d'idées reçues, le multi-process est plutot plus simple que le multi-thread, surtout si les différentes taches sont vraiment decouplées...
Sinon ou shmget pour l'allouer ou le retrouver...
ipcs pour le voir depuis la ligne de commande...
Marsh Posté le 04-07-2002 à 19:29:30
et ipcrm quand t'as chié dans la colle
Marsh Posté le 04-07-2002 à 19:48:57
BENB a écrit a écrit : Non au contraire... C'est bien plus compliqué avec des Threads... La au moins il n'y a que le segment de memoire où il peut a avoir conflit d'acces, il n'y a aucun Pb de reponse à un signal, etc... Contrairement a bcp d'idées reçues, le multi-process est plutot plus simple que le multi-thread, surtout si les différentes taches sont vraiment decouplées... Sinon ou shmget pour l'allouer ou le retrouver... ipcs pour le voir depuis la ligne de commande... |
Sous unix y'a pvm : Paralel(l) Virtual Machine ou un truc dans le genre.
Marsh Posté le 05-07-2002 à 09:48:49
BENB a écrit a écrit : Non au contraire... C'est bien plus compliqué avec des Threads... |
Pour avoir expérimenté les deux, je ne trouve pas DU TOUT...
Après, c'est peut-être une question de goûts et de méthodes, mais bon...
Marsh Posté le 05-07-2002 à 10:10:39
Jar Jar a écrit a écrit : Pour avoir expérimenté les deux, je ne trouve pas DU TOUT... Après, c'est peut-être une question de goûts et de méthodes, mais bon... |
Peut-etre n'es tu pas allé au fonds des choses...
Conflits d'acces memoire limites au segments de memoires partagés en multi-process
Parties de codes non reentrantes ne genent pas en multi-process
Enfin la gestion des signaux ne pose aucun problèmes en multiprocess...
Marsh Posté le 05-07-2002 à 10:42:56
BENB a écrit a écrit : Conflits d'acces memoire limites au segments de memoires partagés en multi-process |
Le fait que la mémoire soit la même n'est pas un problème mais ce qu'on recherche quand on fait des threads. À moins de programmer comme un porc, les threads ne vont pas s'amuser à aller tout le temps écrire dans la même zone mémoire.
Citation : Parties de codes non reentrantes ne genent pas en multi-process |
Du code non réentrant ? Ça existe ?
Citation : Enfin la gestion des signaux ne pose aucun problèmes en multiprocess... |
Ça, c'est un problème lié uniquement à l'implémentation LinuxThreads, pas aux threads en eux-mêmes. Pthreads-NG devrait résoudre ça en se conformant correctement à POSIX.
Marsh Posté le 05-07-2002 à 10:50:26
Citation : Du code non réentrant ? Ça existe ? |
Plusieurs fonctions de la librairie standard
sont non reentrantes.
En gros, celles qui ont un état interne codé
avec un bon vieux "static".
Il existe des versions reentrantes des fonctions de librairies
en general avec un _r ajouté à la fin mais evidemment leur prototype est different.
La compatibilité avec les threads, a l'epoque ou je codais
sous Linux, n'était pas tres bonne puisque deux threads
pouvaient avoir besoin de ces fonctions en simultané d'ou la necessité de coder avec les versions reentrantes (a moins de tout proteger avec des sections critiques mais bof..).
LeGreg
Marsh Posté le 05-07-2002 à 10:57:10
Jar Jar a écrit a écrit : Le fait que la mémoire soit la même n'est pas un problème mais ce qu'on recherche quand on fait des threads. À moins de programmer comme un porc, les threads ne vont pas s'amuser à aller tout le temps écrire dans la même zone mémoire.
Du code non réentrant ? Ça existe ?
Ça, c'est un problème lié uniquement à l'implémentation LinuxThreads, pas aux threads en eux-mêmes. Pthreads-NG devrait résoudre ça en se conformant correctement à POSIX. |
Le code non reentrant, oui ca existe, et en grande quantité, surtout quand tu travailles sur une application ancienne et de grande taille !
La programmation des Threads n'est pas impossible, et tout ce que je cite se resouds, mais en multiprocess, ces problèmes ne se posent pas, d'ou une plus grande simplicité...
Marsh Posté le 05-07-2002 à 12:15:21
legreg a écrit a écrit : Plusieurs fonctions de la librairie standard sont non reentrantes. En gros, celles qui ont un état interne codé avec un bon vieux "static". Il existe des versions reentrantes des fonctions de librairies en general avec un _r ajouté à la fin mais evidemment leur prototype est different. |
gcc -D_REENTRANT
(oui, je sais, toutes les libc ne sont pas aussi bien foutues que la glibc)
Marsh Posté le 05-07-2002 à 12:44:37
joce a écrit a écrit : et ipcrm quand t'as chié dans la colle |
et tous les soir, les profs scannent les machines et zou, - 1 pt par IPC et par taches retrouvés
Marsh Posté le 05-07-2002 à 13:16:53
Jar Jar a écrit a écrit : gcc -D_REENTRANT (oui, je sais, toutes les libc ne sont pas aussi bien foutues que la glibc) |
je crois que tu n'as pas bien compris le probleme.
Le fait de specifier le flag _REENTRANT
ne rend pas reentrantes les fonctions qui
intrinsequement ne peuvent pas l'etre.
asctime() n'est pas reentrante meme avec le flag _REENTRANT
parce que la chaine de retour est stockée comme
un static char result[].
en cas de programme multithread
il FAUT utiliser asctime_r.
De plus la reentrance n'est pas seulement un probleme
pour les applications multithreads
mais également celles qui font des appels
successifs à la meme fonction: on s'attend
a ce qu'un deuxieme appel à la fonction de temps
ne change pas la premiere valeur retournée.
(c'est comme si on te donnait un bonbon, et
que la personne qui te l'a donné vienne te le reprendre
pour le donner a quelqu'un d'autre)
LeGreg
Marsh Posté le 05-07-2002 à 13:40:17
LeGreg > et surtout ce flag ne change pas les fonctions qui ne font pas partie de bibliotheque standard...
Fonction quelques fois ecrites en FORTRAN, ou à une epoque ou la notion de multi-threading n'existait meme pas...
Marsh Posté le 05-07-2002 à 16:06:07
legreg a écrit a écrit : Le fait de specifier le flag _REENTRANT ne rend pas reentrantes les fonctions qui intrinsequement ne peuvent pas l'etre. asctime() n'est pas reentrante meme avec le flag _REENTRANT parce que la chaine de retour est stockée comme un static char result[]. |
Évidemment... Mais quand on fait du MT, c'est typiquement le genre de fonction qu'on appelle dans un thread et pas dans les autres. Sinon, bien sûr, on n'a pas le choix, il faut utiliser un mutex. C'est quand même pas bien sorcier...
Marsh Posté le 05-07-2002 à 18:10:49
ah oui et tu communiques
comment le fait qu'il faut entourer les sections
critiques avec un mutex??
et tu le places ou ton mutex, dans un header
public? dans un wrapper qui transforme
asctime en truc reentrant?
C'est pas mieux de compter sur l'intelligence de tes
collegues (tout est relatif, on en a bien la preuve)
pour ne pas utiliser les fonctions de librairie
non threadsafe?
Surtout que au final si tu regardes le code
de asctime(), tout cela va finir par
un appel a asctime_r
et c'est bien dommage d'utiliser une section
critique pour ca..
LeGreg
Marsh Posté le 05-06-2003 à 10:57:49
ce n'est pas plus dur avec les threads étant donné que avec tu n'as pas à créer ton mutex avec des sémaphore une fonction est concu pour ca.
Marsh Posté le 05-06-2003 à 11:00:05
DarkOli a écrit : |
heuh oui, mais c koi le rapport
Marsh Posté le 05-06-2003 à 11:45:53
Gaspard a écrit : Bonjour, |
Je tiens a dire ke je respecte fortement les gens ki ont deviné l'OS et le langage... Franchement bravo les gars, paske le sujet etait kan meme "tres" precis.
Aller, juste pour faire chier je vais dopnner la solution ms sous Win32 :
Code :
|
Code :
|
Donc, ya les FileMapping, ms ya aussi les named pipes (sous 2K) par exemple. Et encore plein de solutions.
Marsh Posté le 04-07-2002 à 11:54:49
Bonjour,
Comment je peux faire pour qu'un processus père puisse avoir accès à un tableau de caractères dont le propriétaire est son processus fils?