Afficher un message
Vieux 07/04/2008, 15h42   #3
Luc Hermitte
Aucun Avatar
 
Messages: n/a
Hébergeur:
Par défaut Re: Des streambufs et des pointeurs *pptr()

On 7 avr, 15:08, James Kanze <james.ka...@gmail.com> wrote:
> Si tu veux des sorties bufferisées, il faut gerer les pointeurs.
> Sinon, ce n'est pas la peine.
>
> Ce que j'ai trouvé utile dans un log, c'est d'effectivement
> collecter tout un enrégistrement dans un std::vector<> (par
> exemple), puis de l'écrire d'un coup. (Sous Unix, l'écriture est
> garantie atomique, au moins jusqu'une certaine taille, et avec
> les bons paramètres en ouverture, elle est aussi garantie à la
> fin de fichier.) Dans ce cas-là, le plus simple, c'est de
> simplement faire un push_back() à chaque appel d'overflow(). On
> pourrait bien cependant préférer l'utilisation du vector comme
> un buffer ; dans ce cas-là, on l'agrandit dans overflow(), et on
> met les pointeurs. Quelque chose du genre :
> [...]
>
> Ça reduit les appels virtuels, etc.
>
> Aussi, il peut être intéressant d'avoir un streambuf par thread,
> afin de ne pas avoir besoin des locks, ou au moins limiter le
> temps qu'on les tient.


OK. Merci pour ta réponse. J'ai passé un peu de temps à la murir, et
je pense avoir saisi maintenant.
Je comprends mieux du coup certains autres choix de l'autre code que
j'avais trouvé -- en gros il y a une classe "point d'accès" qui
renvoie un ostream localisé au thread courant (TSS).

Or, à cause d'une bibliothèque externe que j'intègre, et qui logge
dans ... std:::cout, je voulais limiter les indirections. Et donc
proposer un unique streambuf qui contient des vecteurs dans des TSS.
Je ne vois pas comment bufferiser plus : mon streambuf forcé dans
std::cout ne pouvant être bufferisé vu que les Xpptr() ne peuvent pas
être directement locaux à des threads.

Merci encore.

--
Luc Hermitte
  Réponse avec citation
 
Page generated in 0,04968 seconds with 9 queries