C++Talk.NET Forum Index C++Talk.NET
C++ language newsgroups
 
Archives   FAQFAQ   SearchSearch   MemberlistMemberlist   UsergroupsUsergroups   RegisterRegister 
 ProfileProfile   Log in to check your private messagesLog in to check your private messages   Log inLog in 

std::cout et multi-thread

 
Post new topic   Reply to topic    C++Talk.NET Forum Index -> C++ (French)
View previous topic :: View next topic  
Author Message
Philip K. Dick
Guest





PostPosted: Wed Apr 18, 2007 4:36 pm    Post subject: std::cout et multi-thread Reply with quote



Hello

J'ai un programme C++ multi-threadé qui contient plein
de std::cout << "bla bla" << xxx << "bla bla bla" << xxx << std::endl;
(idem avec cerr)

Les traces se mélangent souvent, aussi je cherche un moyen de les
traiter dans un seul thread, tout en minimisant les modifications
du code (par exemple avec une classe xxx exportant une méthode cout/cerr)

Est-ce que cela existe déjà ?

Merci,

PKD
Back to top
Alain Migeon
Guest





PostPosted: Wed Apr 18, 2007 5:33 pm    Post subject: Re: std::cout et multi-thread Reply with quote



In article <f04vs7$5jf$1 (AT) albert (DOT) ath.cena.fr>, philip.k.dick (AT) tele2 (DOT) fr
says...
Quote:
Hello

J'ai un programme C++ multi-threadé qui contient plein
de std::cout << "bla bla" << xxx << "bla bla bla" << xxx << std::endl;
(idem avec cerr)

Les traces se mélangent souvent, aussi je cherche un moyen de les
traiter dans un seul thread, tout en minimisant les modifications
du code (par exemple avec une classe xxx exportant une méthode cout/cerr)

Est-ce que cela existe déjà ?

Merci,

PKD

Tu peux créer une queue dans laquelle tu places les chaînes à imprimer.

Mais il faudra implémenter un système de signal à la thread qui va
imprimer, ainsi que protéger l'accès à la queue.

Sinon, il est possible d'utiliser un sémaphore que l'on prend avant le
cout et qu'on libère juste après.

_________________________________________________
Alain Migeon
Please reverse alain and migeon for replying.
Back to top
Guest






PostPosted: Wed Apr 18, 2007 6:41 pm    Post subject: Re: std::cout et multi-thread Reply with quote



On Apr 18, 1:36 pm, "Philip K. Dick" <philip.k.d...@tele2.fr> wrote:
Quote:
Hello

J'ai un programme C++ multi-threadé qui contient plein
de std::cout << "bla bla" << xxx << "bla bla bla" << xxx << std::endl;
(idem avec cerr)

Les traces se mélangent souvent, aussi je cherche un moyen de les
traiter dans un seul thread, tout en minimisant les modifications
du code (par exemple avec une classe xxx exportant une méthode cout/cerr)

Est-ce que cela existe déjà ?

En utilisant des temporaires:

class SyncCout
{
static Lock m_lock; //spécifique à ta plate-forme
public:
SyncCout()
{
m_lock.lock();
}

~SyncCout()
{
m_lock.unlock();
}
};
Lock SyncCout::m_lock;

template<typename T> inline SyncCout const& operator<<(SyncCout const&
dest, T const& obj)
{
std::cout<<obj;
return dest ;
}

inline SyncCout const& operator<<(SyncCout const& dest, std::ios_base&
(*manip)( std::ios_base& ) )
{
std::cout<<manip;
return dest ;
}

inline SyncCout const& operator<<(SyncCout const& dest, std::ostream&
(*manip)( std::ostream& ) )
{
std::cout << manip ;
return dest ;
}

Ensuite, tu remplaces partout dans ton code "std::cout<<blabla....."
par "SyncCout()<<blabla..."

Arnaud
Back to top
HERMITTE Luc
Guest





PostPosted: Wed Apr 18, 2007 7:09 pm    Post subject: Re: std::cout et multi-thread Reply with quote

On 18 avr, 13:36, "Philip K. Dick" <philip.k.d...@tele2.fr> wrote:
Quote:
Hello

J'ai un programme C++ multi-threadé qui contient plein
de std::cout << "bla bla" << xxx << "bla bla bla" << xxx << std::endl;
(idem avec cerr)

Les traces se mélangent souvent, aussi je cherche un moyen de les
traiter dans un seul thread, tout en minimisant les modifications
du code (par exemple avec une classe xxx exportant une méthode cout/cerr)

Est-ce que cela existe déjà ?

Il doit bien y avoir un moyen de définir son propre streambuf qui
encapsulera d'autres streambufs (un par thread ; voir à utiliser des
TSS), non?
Après, il reste à synchroniser les flush, et à détourner le streambuf
de std::cout pour y mettre le notre.

Pour ce qui est des synchronisations avec cin, je soupçonne que cela
sera moins facile.


Sinon, il existe des systèmes de log qui se posent la question de
pouvoir fonctionner en environnement MT.

--
Luc Hermitte
Back to top
James Kanze
Guest





PostPosted: Wed Apr 18, 2007 11:12 pm    Post subject: Re: std::cout et multi-thread Reply with quote

On Apr 18, 1:36 pm, "Philip K. Dick" <philip.k.d...@tele2.fr> wrote:

Quote:
J'ai un programme C++ multi-threadé qui contient plein
de std::cout << "bla bla" << xxx << "bla bla bla" << xxx << std::endl;
(idem avec cerr)

Les traces se mélangent souvent, aussi je cherche un moyen de les
traiter dans un seul thread, tout en minimisant les modifications
du code (par exemple avec une classe xxx exportant une méthode cout/cerr)

Est-ce que cela existe déjà ?

J'utilise normalement un wrapper du flux de sortie ; il
s'occupe non seulement du lock, mais aussi de générer les têtes
de lignes, assurer un flush à la fin, etc. Grosso modo :

class OutputStreamWrapper
{
public:
OutputStreamWrapper( std::ostream* dest )
: myCounter( new int() )
, myStream( dest )
{
++ (*myCounter) ;
if ( dest != NULL ) {
pthread_mutex_lock( logMutext ) ;
}
}
OutputStreamWrapper( OutputStreamWrapper const& other )
: myCounter( other.myCounter )
, myStream( other.myStream )
{
++ (*myCounter) ;
}
~OutputStreamWrapper()
{
-- (*myCounter) ;
if ( *myCounter == 0 ) {
if ( myStream != NULL ) {
myStream->flush() ;
}
delete myCounter ;
pthread_mutex_unlock( logMutext ) ;
}
}
std::ostream* stream() const
{
return myStream ;
}

private:
int* myCounter ;
std::ostream* myStream ;
} ;

template< typename T >
OutputStreamWrapper const&
operator<<( OutputStreamWrapper const& dest, T const& obj )
{
std::ostream* s = dest.stream() ;
if ( s != NULL ) {
*s << obj ;
}
return dest ;
}

template< typename T >
inline OutputStreamWrapper const&
operator<<(
OutputStreamWrapper const&
dest,
T const& obj )
{
std::ostream* stream = dest.stream() ;
if ( stream != NULL ) {
*stream << obj ;
}
return dest ;
}

// Je ne me rappelle plus pourquoi il a fallu celle-ci...
inline OutputStreamWrapper const&
operator<<(
OutputStreamWrapper const&
dest,
char const* cString )
{
std::ostream* stream = dest.stream() ;
if ( stream != NULL ) {
*stream << cString ;
}
return dest ;
}

// Parce que les manipulateurs sont aussi des templates...
inline OutputStreamWrapper const&
operator<<(
OutputStreamWrapper const&
dest,
std::ios_base& (* manip)( std::ios_base& ) )
{
std::ostream* stream = dest.stream() ;
if ( stream != NULL ) {
*stream << manip ;
}
return dest ;
}

// Parce que les manipulateurs sont aussi des templates...
inline OutputStreamWrapper const&
operator<<(
OutputStreamWrapper const&
dest,
std::ostream& (* manip)( std::ostream& ) )
{
std::ostream* stream = dest.stream() ;
if ( stream != NULL ) {
*stream << manip ;
}
return dest ;
}

J'utilise à peu près le même, mais avec quelque features en
plus. (Chez moi, c'est une fonctionne qui le crée, en fonction
des paramètres de configuration ; et à la place de std::cout,
j'utilise un flux avec un streambuf sur mesure qui est informé
du début de chaque trace, et modifie ses têtes de lignes en
conséquence.)

--
James Kanze (Gabi Software) email: james.kanze (AT) gmail (DOT) com
Conseils en informatique orientée objet/
Beratung in objektorientierter Datenverarbeitung
9 place Sémard, 78210 St.-Cyr-l'École, France, +33 (0)1 30 23 00 34
Back to top
Marc Espie
Guest





PostPosted: Thu Apr 19, 2007 8:47 am    Post subject: Re: std::cout et multi-thread Reply with quote

Je n'ai pas eu trop a faire ca, mais j'avoue que j'aurais effectivement
tendance a rajouter un streambuf, et a juste proteger les entrees-sorties
effectives sur le flux par un lock, histoire de minimiser la section
non parallelisable. Evidemment, ca va dependre de la densite d'entrees-sorties
et du niveau de concurrence requis...
Back to top
James Kanze
Guest





PostPosted: Sat Apr 21, 2007 12:16 am    Post subject: Re: std::cout et multi-thread Reply with quote

On Apr 19, 10:47 am, e...@lain.home (Marc Espie) wrote:
Quote:
Je n'ai pas eu trop a faire ca, mais j'avoue que j'aurais
effectivement tendance a rajouter un streambuf, et a juste
proteger les entrees-sorties effectives sur le flux par un
lock, histoire de minimiser la section non parallelisable.
Evidemment, ca va dependre de la densite d'entrees-sorties et
du niveau de concurrence requis...

Il y a en effet une autre solution : utiliser un streambuf per
thread, avec toutes les données gardées en buffer jusqu'au flush
de la fin du message de log, puis synchroniser, et écrire vers
le flux final (voire y écrire d'une écriture atomique
directement). Reste que dans les logs un peu plus compliquées,
il faut bien signaler la fin d'un message d'une façon ou une
autre. Dans beaucoup de cas, évidemment, reconnaître un '\n'
et écrire chaque ligne de façon atomique fera l'affaire.

Mais ça suppose aussi la possibilité de rétrouver le flux (ou le
buffer) rapidement en fonction du thread. Ce qui n'est pas
toujours donné non plus.

--
James Kanze (Gabi Software) email: james.kanze (AT) gmail (DOT) com
Conseils en informatique orientée objet/
Beratung in objektorientierter Datenverarbeitung
9 place Sémard, 78210 St.-Cyr-l'École, France, +33 (0)1 30 23 00 34
Back to top
Bruno Causse
Guest





PostPosted: Sun Apr 22, 2007 5:05 pm    Post subject: Re: std::cout et multi-thread Reply with quote

Philip K. Dick <philip.k.dick (AT) tele2 (DOT) fr> wrote:

Quote:
Hello

J'ai un programme C++ multi-threadé qui contient plein
de std::cout << "bla bla" << xxx << "bla bla bla" << xxx << std::endl;
(idem avec cerr)

Les traces se mélangent souvent, aussi je cherche un moyen de les
traiter dans un seul thread, tout en minimisant les modifications
du code (par exemple avec une classe xxx exportant une méthode cout/cerr)

Est-ce que cela existe déjà ?

Merci,

PKD

j'avais le meme probleme.

ma solution

ecrire dans des fichiers separés (1 par thread) et visualiser par "tail
-f nomfichier"
--
Bruno Causse
http://perso.wanadoo.fr/othello
Back to top
Philip K. Dick
Guest





PostPosted: Wed Apr 25, 2007 11:22 pm    Post subject: Re: std::cout et multi-thread Reply with quote

Philip K. Dick wrote:
Quote:
Hello

J'ai un programme C++ multi-threadé qui contient plein
de std::cout << "bla bla" << xxx << "bla bla bla" << xxx << std::endl;
(idem avec cerr)

Les traces se mélangent souvent, aussi je cherche un moyen de les
traiter dans un seul thread, tout en minimisant les modifications
du code (par exemple avec une classe xxx exportant une méthode cout/cerr)

Est-ce que cela existe déjà ?

Merci à tous pour vos réponses !
Back to top
Display posts from previous:   
Post new topic   Reply to topic    C++Talk.NET Forum Index -> C++ (French) All times are GMT
Page 1 of 1

 
Jump to:  
You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot vote in polls in this forum


Powered by phpBB © 2001, 2006 phpBB Group
SEO toolkit © 2004-2006 webmedic.