7
votes

Lancement de threadsafe

Je veux mettre en œuvre une classe simple pour la journalisation de plusieurs threads. L'idée qu'il y ait, que chaque objet qui veut enregistrer des trucs, reçoit un objet OSTREAM qu'il peut écrire des messages à l'utilisation des opérateurs habituels. Le comportement souhaité est que les messages sont ajoutés au journal lorsque le flux est rincé. De cette façon, les messages ne seront pas interrompus par des messages d'autres threads. Je souhaite éviter d'utiliser une chaîne temporaire pour stocker le message, car cela ferait la plupart des messages au moins des deux twoliners. Comme je le vois, la manière standard de réaliser cela serait de mettre en œuvre mon propre streambuffer, mais cela semble très encombrant et surmontée. Y a-t-il un moyen plus simple de faire cela? Sinon, connaissez-vous un bon article / HOWTO / Guide sur les streambufs personnalisés?

Merci d'avance,

espace_c0wbo0y

mise à jour:

Comme il semble fonctionner, j'ai ajouté ma propre réponse.


1 commentaires

On dirait une bonne solution! Peut-être l'ajouter comme votre propre réponse?


4 Réponses :


5
votes

Jetez un coup d'oeil à log4cpp ; Ils ont un support multi-thread. Cela peut sauver votre temps.


2 commentaires

Merci pour votre réponse. Cependant, en raison de la restriction de mon environnement de travail, je ne peux pas introduire une nouvelle bibliothèque. En outre, la plupart des bibliothèques de journalisation existantes sont beaucoup trop lourdes pour mes besoins.


Si vous recherchez une licence plus libérale, voir Log4CXX par Apache. Logging.apache.org/log4cxx/index.html



1
votes

Alors, j'ai regardé Boost.iostreams et Voici ce que j'ai proposé:

TestSink sink;
boost::iostreams::stream_buffer< TestSink > testbuf( sink, 50000 );
std::ostream out( &testbuf );

for ( int i = 0; i < 10000; i++ )
    out << "test" << i;

out << std::endl;


0 commentaires

0
votes

re. votre propre réponse. Si vous utilisez ceci pour la journalisation des erreurs et que vous programmez des accidents avant de rincer votre flux, vous êtes un peu inutile, n'est-ce pas?


2 commentaires

Je suppose que ce serait un problème avec une approche forestière.


Sauf pour les systèmes de journalisation comme ETW qui ont une aide extérieure.



1
votes

Vous pensez que Log4CPP est trop lourd et vous atteignez votre boost.iostreams à la place? Hein?

Vous voudrez peut-être envisager logog . C'est le fil-coffre-fort pour Posix, Win32 et Win64.


1 commentaires

Si Boost est déjà dans son ensemble de bibliothèques, ce n'est pas si lourd. Sinon, totalement d'accord avec vous.