Question

Je veux mettre en œuvre une classe simple pour la connexion de plusieurs threads. L'idée est là, que chaque objet qui veut connecter des choses, reçoit un ostream objet qu'il peut écrire des messages à l'aide des opérateurs habituels. Le comportement souhaité est que les messages sont ajoutés au journal lorsque le flux est vidé. De cette façon, les messages ne sera pas interrompu par des messages d'autres threads. Je veux éviter d'utiliser un stringstream temporaire pour stocker le message, car cela rendrait la plupart des messages au moins twoliners. Comme je le vois, la manière standard d'y parvenir serait de mettre en œuvre ma propre streambuffer, mais cela semble très lourd et sujette aux erreurs. Y at-il un moyen plus simple de le faire? Sinon, savez-vous un bon article / howto / guide sur les streambufs personnalisés?

Merci à l'avance,

Space_C0wbo0y

Mise à jour:

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

Était-ce utile?

La solution 2

Alors, j'ai regardé Boost.IOstreams voici ce que je suis venu avec:

class TestSink : public boost::iostreams::sink {
public:
    std::streamsize write( const char * s, std::streamsize n ) {
        std::string message( s, n );
            /* This would add a message to the log instead of cout.
               The log implementation is threadsafe. */
        std::cout << message << std::endl;
        return n;
    }
};

TestSink peut être utilisé pour créer un courant de tampon (voir stream_buffer-modèle ). Chaque thread recevra sa propre instance de TestSink, mais tout TestSinks va écrire dans le même journal. TestSink est utilisé comme suit:

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;

Le fait important est ici, que TestSink.write est appelée uniquement lorsque le flux est rincé (std::endl ou std::flush), ou lorsque la mémoire tampon interne de l'instance de stream_buffer est pleine (la taille de la mémoire tampon par défaut ne peut pas tenir 40000 caractères, donc j'initialiser ce à 50000). Dans ce programme, TestSink.write est appelé exactement une fois (la sortie est trop long pour poster ici). De cette façon, je peux écrire en utilisant logmessage flux-IO normale formaté sans variables temporaires et assurez-vous que le message est affiché dans le journal en une seule pièce quand je tire la chasse flux.

Je vais laisser la question ouverte un autre jour, dans le cas où il y a différentes suggestions / problèmes que je ne l'ai pas pris en compte.

Autres conseils

Jetez un oeil à log4cpp ; ils ont un support multi-thread. Il peut enregistrer votre temps.

Vous pensez log4cpp est trop lourd et que vous atteignez pour Boost.IOStreams au lieu? Huh?

Vous pouvez envisager logog . Il est thread-safe pour Posix, Win32 et Win64.

Re. votre propre réponse. Si vous utilisez ce pour la journalisation des erreurs et vous programme se bloque avant le rinçage de votre flux, puis vous connecter est un peu inutile est pas?

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top