[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [linux] [OT] Programmation: petites questions...



-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1


Non en fait je contacte un serveur web et je rapatrie les données qu'il 
m'envoie. (html, images, applet, etc...)
Et je peux avoir un nombre indéterminé de threads qui ouvrent des 
connections une connection vers un serveur web.
Normalement, la zone mémoire n'est pas partagée entre les threads. 
L'usage de sémaphores est impossible vu que je n'ai pas accès aux 
serveurs webs et puis ce serait ultra inefficace... ;-)

Voilà le symptôme mieux décrit:

avec usleep et la valeur qu'il prend, pas de problème, je reçois bien 
les pages en entier (sauf petit problème localisé)

sans usleep, les pages qui passaient avant ne s'affiche plus en entier. 
Souvent je n'ai que le début. Par exemple pour une image, je n'ai que 
la moitié de l'image. Comme si on recevait la fin de connection du 
proxy/server et que l'on envoyait la réponse au client web.

Le seul paramètre qui change, c'est le usleep. J'aimerais donc savoir 
si j'ai loupé un truc quelque part au niveau gestion de la mémoire et 
savoir si il y a des délais au niveau de l'allocation/utilisation...

Merci 

Ben


Le Mardi 27 Novembre 2001 12:02, vous avez écrit :
> Salut, si j'ai bien compris tu as un thread qui remplit le buffer
> msgrcv et un autre qui le lit et cela en concurrence...
>
> Ton usleep t'évite ces désagréments, mais ce n'est toujours pas la
> bonne méthode.
> Tu réduits juste les risques que ton thread lise les données en même
> temps que l'autre les écrit.
> Il vaut mieux utiliser des sémaphores (man semaphore).
>
> Le mieux est de créer deux fonctions: remplir_buffer() et
> consommer_buffer().
> Tu as un sémaphore commun aux 2 threads, appelons le buffSem.
>
> remplir_buffer() {
>       sema_wait(bufSem);
>
>  	if ((nbreBytesRecus = recv(handler, msgrcv+totrecu,
>  				  TAILLEMSGMAX, 0)) == -1) {
>           /* rendre le sémaphore */
>                   sema_post(bufSem);
>
>  			DD("Rien recu... \n"," ");
>  			perror("pas de reception\n");
>  			return NULL;
>  	}
>  	else {
>          /* rendre le sémaphore */
>             sema_post(bufSem);
>
>  		sprintf(tg,"%d",nbreBytesRecus);
>  		DD("nbreBytesRecus : %s\n",tg);
>
>  		usleep(100000);
>  		fflush(NULL);
>  		totrecu += nbreBytesRecus;
>
> }
>
> Tu places donc remplir_buffer() dans ta boucle.
>
> Dans l'autre thread, dans chaque cycle tu appelles la fonction
> consommer_buffer(buffer_local) et tu travailles sur buffer_local,
> sans risque qu'il soit corrompu au fur et à mesure de la lecture.
>
> consommer_buffer(char *copie_buffer){
>     sema_wait(semBuf);
>     memcpy(copie_buffer, msgrcv, totrecu);
>     sema_post(semBuf);
> }
>
> En espérant que ça te dépanne.
>
> Christophe
>
> > -----Original Message-----
> > From: Benoit Joseph [mailto:benoit.joseph@teledisnet.be]
> > -----BEGIN PGP SIGNED MESSAGE-----
> > Hash: SHA1
> >
> >
> > Salut,
> >
> > Je dois programmer un proxy cache pour mes études, tout se passe
> > bien Juste une ou deux petites questions...
> >
> > 1) Y a -t-il moyen de rendre les opérations sur la mémoire
> > synchrones? Parce que je dois jouer avec des zones mémoires "assez
> > grandes" ou faire des realloc (puisque je ne sais pas a priori la
> > taille de ce que je reçois...). Le problème est que je suis obligé
> > de mettre un usleep pour freiner le processus sinon, quand je
> > boucle, je reviens sur le recv() et les opérations mémoires sont
> > corrompues... (même si je vire le realloc). C'est sans doute une
> > bêtise mais je ne la vois pas. Je précise que je programme en
> > multithread et donc que ce code peut tourner un nombre indéterminé
> > de fois en même temps
> >
> > voici le code incriminé:
> >
> >  do {
> > 	if ((nbreBytesRecus = recv(handler, msgrcv+totrecu,
> > 				  TAILLEMSGMAX, 0)) == -1) {
> > 			DD("Rien recu... \n"," ");
> > 			perror("pas de reception\n");
> > 			return NULL;
> > 	}
> > 	else {
> > 		sprintf(tg,"%d",nbreBytesRecus);
> > 		DD("nbreBytesRecus : %s\n",tg);
> >
> > 		usleep(100000);
> > 		fflush(NULL);
> > 		totrecu += nbreBytesRecus;
> >
> > 	}
> > }while (nbreBytesRecus != 0 && nbreBytesRecus == TAILLEMSGMAX &&
> >           nbreBytesRecus != -1);
> >
> > Voilà c'est l'essentiel...
> >
> > Si quelqu'un a une solution..
> >
> > D'avance merci
> >
> > Ben
> > -----BEGIN PGP SIGNATURE-----
> > Version: GnuPG v1.0.6 (GNU/Linux)
> > Comment: For info see http://www.gnupg.org
> >
> > iD8DBQE8A24yLPnuiaZn1q4RAinsAJ0eRyn0ko8Cmp14JassPrz68rhweQCfZcKI
> > hxHmN95enTkANjPy26algqE=
> > =Mjne
> > -----END PGP SIGNATURE-----
> >
> > [ Soyez précis dans vos sujets svp afin de déterminer directement 
> > ] [ le type de demande...                                          
> >  ] [ Pour vous (dés)inscrire, aller sur http://unixtech.be/ml.php  
> >   ] [ Archives de la mailing list:
> > http://archives.unixtech.be/linux/  ] [ http://unixtech.be         
> >     Contact: listmaster@unixtech.be  ]
>
> [ Soyez précis dans vos sujets svp afin de déterminer directement  ]
> [ le type de demande...                                            ]
> [ Pour vous (dés)inscrire, aller sur http://unixtech.be/ml.php     ]
> [ Archives de la mailing list: http://archives.unixtech.be/linux/  ]
> [ http://unixtech.be              Contact: listmaster@unixtech.be  ]
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.0.6 (GNU/Linux)
Comment: For info see http://www.gnupg.org

iD8DBQE8A4zvLPnuiaZn1q4RAsF5AKC092moZPYUNLV23hDCY4Dm7C8z2gCgzhOG
luo4HZLQYU9U2DyTdWmBLEQ=
=bXhA
-----END PGP SIGNATURE-----

[ Soyez précis dans vos sujets svp afin de déterminer directement  ]
[ le type de demande...                                            ]
[ Pour vous (dés)inscrire, aller sur http://unixtech.be/ml.php     ]
[ Archives de la mailing list: http://archives.unixtech.be/linux/  ]
[ http://unixtech.be              Contact: listmaster@unixtech.be  ]