Newsgroup: it.comp.os.linux.development
Titolo: threads & streams

Ciao,
sto` facendo qualche prova col c++ (g++),
cerco di scrivere su un ofstream da diversi threads ma ho qualche
dubbio:
Posso usare "lock" e "unlock" come per cout e cerr?
Devo usare i mutex? sono un po` confuso, ho trovato un sacco di
documentazione generale ma nulla di specifico.
Uso i pthread in c-style.
Inoltre su macchine diverse (anche con stesse versioni di librerie e
compilatore e stessa distribuzione: RH7.1) ottengo delle differenze:
se in una lock & unlock funzionano, nell'altra si ferma tutto. Potete
aiutarmi?
grazie, ciao ciao.

 aiutarmi?
Probabilmente c'e' qualche race condition.
--
  	Giuseppe "Cowo" Corbelli  -->>  Riding on Linux-2.4.3-xfs
    **ANTI-SPAM** -- **Substitute IHATESPAM with cowo to reply by mail**
  -<! A mathematician is a device for turning coffee into theorems. !>-
                P. Erdos

 Probabilmente c'e' qualche race condition.
race che?
Cmq ho trovato il problema, mi basta sostituire endl con "\n" e tutto
funziona su tutte le macchine, non so perche` :(
Grazie, ciao.

 documentazione generale ma nulla di specifico.
Come le mutex funzionerebbe di sicuro:
pthread_mutex_lock(&lock_cerr);
std::cerr << "messaggio" << std::endl;
pthread_mutex_unlock(&lock_cerr);
Comunque e` una  brutta cosa: bloccare tutto il  programma per l'output.
Non ci sono motivi particolari per farlo (se stessi scrivendo su un file
sarebbe diverso), a meno che tu non voglia serializzare l'output.
I blocchi potrebbero dipendere da qualche dead lock:
Thread 1				Thread 2
pthread_mutex_lock(&lock_cerr);		
cerr << "bla" << endl;			
					pthread_mutex_lock(&lock_cout);
					cout << "bla" << endl;
pthread_mutex_lock(&lock_cout);
/* thread 1 rimane in attesa che
thread 2 sblocchi lock_cout
*/
					pthread_mutex_lock(&lock_cerr);
					/* thread 2 rimane in attesa che
					thread 1 sblocchi lock_cerr
					*/
In questa situazione entrambi i thread sono bloccati in attesa che
l'altro liberi la mutex.
ciao
Kronos
-- 
Home: 
http://kronoz.cjb.net
This message will self distruct in 5 seconds.

 pthread_mutex_unlock(&lock_cerr);
e comunque sulla RH 7,1 non funziona neanche coi mutex (la libstdc++ e' 
compilata *senza* -DREENTRANT!!!)

 funziona su tutte le macchine, non so perche` :(
Boh, vedi esauriente descrizione della mia preparazione in cpp.
-- 
    Giuseppe "Cowo" Corbelli  -->>  Riding on Linux-2.4.3-xfs
    **ANTI-SPAM** -- **Substitute IHATESPAM with cowo to reply by mail**
		-<! $>cd /pub	$>more beer !>-


per la serie "Viva l'ignoranza!"...
Che e' il flag -DREENTRANT?
Sto scivendo un programma con thread mutex e diavolerie varie ma non l'ho 
mai usata... cosa mi perdo?
-- 
Alessandro >>CoMiX<< Cominu
e-mail: 
aco...@tiscalinet.it
Icq: 116354077
Registered user at 
http://counter.li.org
 # 203765

 l'ho mai usata... cosa mi perdo?
nulla, te la definisce pthread.h

 sarebbe diverso), a meno che tu non voglia serializzare l'output.
Come ho spiegato in precedenza si tratta di uno stream "ofstream",
trattasi di scrittura su un file di log, in pratica ogni thread serve un
client (una socket) e loga le operazioni su un file, comune a tutti i
thread.
Deve scrivere solo una o due righe alla volta, pochi byte, non prevedo un
grosso rallentamento, l'importante e` che i thread scrivano nel file uno
alla volta o rischio che venga tutto mischiato!
Comunque ho finalmente capito come lavorano i mutex ;) meglio tardi che
mai! usero` questi, sono perfetti.
Grazie per l'aiuto, Simone.

 Boh, vedi esauriente descrizione della mia preparazione in cpp.
Il problema deriva da "endl" credo che in qualche modo effetui un bloccaggio dello
stream che resta occupato e blocca tutto, non so altro, forse e` un bug
di qualche libreria...
Ciao e grazie!

On Sat, 21 Jul 2001 13:55:27 GMT, CC 
was talkin'about:

Sicuro sicuro? Quoto da FAQ-threads incluse nella glibc
H.1: You say all multithreaded code must be compiled with _REENTRANT
	 defined. What difference does it make?
 
   It affects include files in three ways:
     * The include files define prototypes for the reentrant variants
	of some of the standard library functions, e.g.
    gethostbyname_r() as a reentrant equivalent to gethostbyname().
     * If _REENTRANT is defined, some <stdio.h> functions
	are no longer defined as macros, e.g. getc() and putc(). In a
    multithreaded program, stdio functions
	require additional locking, which the macros
	don't perform, so we must call functions instead.
Ecc ecc...
 
--
  	Giuseppe "Cowo" Corbelli  -->>  Riding on Linux-2.4.3-xfs
    **ANTI-SPAM** -- **Substitute IHATESPAM with cowo to reply by mail**
  -<! I Never Wanted To Be What They Told Me To Be
  		Fulfill My Fate Then I'll Be Free >!-
  			Blind Guardian - Mordred's Song