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
|