Newsgroup: it.comp.lang.c
Titolo: Many threads and CPU 100%

Ciao a tutti,
il subject riepiloga il mio problema. Ho scritto un programma con diversi
threads concorrenti (5) che si scambiano messaggi attraverso memoria
condivisa (uso intensivo dei Mutex). Il problema è che questi 5 threads
sono composti, principalmente, da 5 loops che si ciucciano tutta la CPU !
Ad esempio ogni thread ha una struttura simile:
void thread() {
	 ...
	while(RUN) {
		...
		GetMutex();
		...
		FreeMutex();
	}	
}
P.S. RUN è TRUE finchè non viene chiesto uno shutdown del programma.
Comne posso impedire l'uso del 100% della CPU ?
-- 
O-Zone ! No(C) 2004
MyPHOTOS Photo-BLOG >>> 
http://myphotos.zerozone.it
 <<< 


IMHO non è possibile: la gestione del tempo di CPU associato ad ogni
processo/thread è compito del sistema operativo, che gestisce il
time-sharing e cerca di dare l'impressione di un parallelismo tra processi
assegnando la CPU ad ogni processo allo scadere di ogni time-slice...
E' una domanda interessante, un po' OT ma di sicuro interesse pratico, anche
a me piacerebbe sentire altre opinioni.
Ciao
Ale

 [CUT]
E dato che il C standard gli thread manco sa cosa siano, sei OT. Ti 
consiglio it.comp.programmare.win32 o it.comp.os.linux.development, a 
seconda del tuo SO.
-- 
Mat/tia Belletti - Undergraduate student @ 
cs.unibo.it
ICQ: 33292311    - email: 
mbel...@cs.unibo.it
IRC: RedGlow     - site(s): 
http://mbellett.web.cs.unibo.it/
Linux registered user 299762 @ Linux registered machine 213003

 Comne posso impedire l'uso del 100% della CPU ?
prova con un semplice:
while(RUN){
	code
	code
	...
	nanosleep(struct timespec); /*e' posix 1.b*/
}
la struct timespec e' cosi' definita:
struct timespec{
	time_t  tv_sec;         /* seconds */
	long    tv_nsec;        /* nanoseconds */
};
definisci il tempo per cui il processo deve 'dormire'.
in questo modo dai anche la possibilita' agli altri processi di avere la
loro fettina di tempo.
ciao e fammi sapere come va
-- 
Er Baitch
http://baitch.altervista.org/

 loro fettina di tempo.
E' abbastanza inutile... immagina di avere solo quel processo in stato
RUNNING : in questo caso l'attesa spreca solo tempo di cpu. E' il sistema
operativo a badare a queste cose, in nessun caso un'istruzione sleep aumenta
le prestazioni complessive del pool di processi/threads.
Ciao
Ale

 le prestazioni complessive del pool di processi/threads.
non credo che tu possa avere solo quel processo attivo su qualsiasi
computer... a meno che non utilizzi un hardware realizzato su misura.
noi utilizzavamo questo 'trucchetto' con le applicazioni grafiche pesanti
e con i server (solitamente ci girano circa 200thread contemporaneamente
che acquisiscono dati a raffica) che senza questa istruzione non
rilasciavano mai il controllo al SO, succhiando cpu a non finire.
cmq, se trovi altre soluzioni, fammi sapere, almeno posso utilizzarle
anche io :-)
-- 
Er Baitch
http://baitch.altervista.org/
-- Fortune of the day --
You will lose your present job and have to become a door to door
mayonnaise salesman.

Avevo il tuo stesso problema,
solo che nel mio caso i thread sono un paio di centinaia (circa 280 !).
ho messo nel ciclo di ogni thread
while {
    /* Fai qualche cosa ....*/
    ...........
    struct timespec req;
    req......
    nanosleep(&req, NULL);
}
ed ora è tutto oK.
ciao