Newsgroup: it.comp.os.linux.development
Titolo: Creare un thread che si esegue in background

Salve a tutti,
Ho bisogno di creare un thread  che venga eseguito (almeno 
concettualmente) a priorità inferiore degli altri thread del programma, 
ovvero deve andare in esecuzione solo quando tutti gli altri stanno 
dormendo.
Da quel che ne so, il comando nice() dovrebbe servire a questo, ma per 
l'intero processo, non per un solo thread.
Mi spiego meglio: il programma in questione è un player mp3, e anche su 
computer abbastanza datati non usa più del 2% di CPU. Ho bisogno di un 
thread che vada in esecuzione solo nel restante 98% senza interferire 
col thread di decodifica (cioè senza causare interruzioni e "click" 
nell'audio).
Ah, ovviamente, il player non ha privilegi di root, e fa già un bel po' 
di buffering per evitare (troppe) interferenze da altri processi...
Grazie a chi mi sa aiutare!
Daniele

 l'intero processo, non per un solo thread.
pthread_setschedparam(3)
Luca
-- 
Home: 
http://kronoz.cjb.net
"La teoria e` quando sappiamo come funzionano le cose ma non funzionano.
 La pratica e` quando le cose funzionano ma non sappiamo perche`.
 Abbiamo unito la teoria e la pratica: le cose non funzionano piu` e non
 sappiamo il perche`." -- A. Einstein

 l'intero processo, non per un solo thread.
Mi sa che in linux, a differenza di windows, i thread sono gestiti come 
semplici processi, ma con puntatori al posto delle variabili. Per questo 
mi aspetto che nice(...) faccia al caso tuo.
(ma stai per caso usando i pthread a livello utente?)

 (ma stai per caso usando i pthread a livello utente?)
Beh, attualmente credo di avere una libc on LinuxThreads, quindi sto 
usando LinuxThreads. Sono thread a livello utente?
Comunque, un programma serio dovrebbe essere un minimo portabile, almeno 
da funzionare anche con una libreria POSIX-compliant, come NTPL 
(NativeThreadPosixLibrary), e forse allora li nice non va più (??). 
Comunque provero, grazie.
Daniele

 
3 = SCHED_RR ?? o cosa?
Comunque, funziona anche con LinuxThreads? so che non è del tutto 
compliant...
Grazie,
Daniele


Azz... ma devo avere privilegi di root... c*$$o ...

 Comunque provero, grazie.
Se vuoi essere sicuro che ad ogni thread sia associato un LWP 
(lightweighted process, cioe' che non sia software), devi crearlo con lo 
scope a livello SYSTEM:
    pthread_attr_setscope(&attrs, PTHREAD_SCOPE_SYSTEM);
    if (pthread_create(&th_, &attrs, threadfunc, this) != 0) { [...] }
Occhio invece che settare la priorita' dei thread o il tipo di 
scheduling e` un'operazione che richiede i privilegi di root per essere 
effettuata.
Bye,
  Gabry

 3 = SCHED_RR ?? o cosa?
Ok, sono un idiota, è la sezione di man :-P

On Tue, 14 Dec 2004 13:01:26 +0100, Daniele 
was talkin'about:
#define IMHO

Do per scontato che tu ti riferisca all'uso dei pthread.
L'API pthread prevede il settaggio della priorità con 
pthread_attr_setschedparam
ove però
This   attribute  is  not  significant  if  the  scheduling  policy  is
SCHED_OTHER; it only matters for the  realtime  policies  SCHED_RR
and SCHED_FIFO.
In sostanza per fare quello che chiedi tu non puoi delegare allo scheduler.
-- 
  Giuseppe "Cowo" Corbelli \/\ My software: 
http://cowo.yoda2000.net
    **ANTI-SPAM** -- **Substitute IHATESPAM with cowo to reply by mail**
    -<! And the will shall return And again hearts shall burn
         All the horns now will sing Leading you back to the metal winds !>-
                  Lost Horizon - Sworn In The Metal Wind

 (NativeThreadPosixLibrary), e forse allora li nice non va più (??). 
Teoricamente pthread = POSIX threads :-))
-- 
  Giuseppe "Cowo" Corbelli \/\ My software: 
http://cowo.yoda2000.net
    **ANTI-SPAM** -- **Substitute IHATESPAM with cowo to reply by mail**
  -<! Drink To Your Brothers Who Are Never To Fall, We Are Brothers Of Metal
  		Here In The Hall! !>- Manowar - Brothers Of Metal PT1

 
Si, l'ho letto quello, e mi ha lasciato parecchio in disappunto.
Cosa mi tocca fare, usare semafori e condizioni e sospendere 
"manualmente" il thread in background, per farlo ripartire, sempre 
manualmente, con un signal dal thread foreground?
Perché è esattamente quanto ho tentato di fare, con scarsissimo 
successo, e introducendo anche un ben + grave problema di deadlock 
(starvation in realtà).
Ok, ho capito, cavo via quel maledetto thread e mi arrangio in qualche 
altra maniera :P (o uso nice, devo ancora vedere se funziona)
Grazie a tutti!
Daniele

 altra maniera :P (o uso nice, devo ancora vedere se funziona)
mpg321 usa fork + shared memory + semafori per gestire un buffer circolare
condiviso.
Tienici aggiornati.
-- 
  Giuseppe "Cowo" Corbelli \/\ My software: 
http://cowo.yoda2000.net
    **ANTI-SPAM** -- **Substitute IHATESPAM with cowo to reply by mail**
  -<! A mathematician is a device for turning coffee into theorems. !>-
                P. Erdos

 ha scritto:

Solo se vuoi alzare la priorita` o passare ad uno scheduling RT.
L'abbassamento di priorita` puo` essere fatto senza privilegi
particolari.
La funzione fa parte dello standard POSIX e ti assicura che venga
cambiata solo la priorita` del thread corrente[1], a prescindere
dall'implementazione.
Luca
[1] Sotto linux, con la libreria LinuxThread oppure NTPL i thread sono
(quasi) dei normali processi quindi andrebbe bene anche nice(). Tuttavia
con nice potresti avere problemi cambiando libreria di threading (in
particolare passando ad una in cui il mapping thread<->processo non e`
1:1).
-- 
Home: 
http://kronoz.cjb.net
"Woe to you, Oh Earth and Sea,
 for the Devil sends out the beast with wrath,
 because he knows the time is short...
 Let him who had understanding reckon the number of the beast
 for it is a human number, its number is Six hundred and sixty six."
Revelations ch XIII, b. 18

 dall'implementazione.
Hum, dopo attenta riflessione direi che, almeno sotto linux,
pthread_setschedparam non fa quello che ci aspetterebbe... in effetti lo
standard dice che il significato dei parametri passati con polici
SCHED_OTHER e` implementation defined.
Quindi rimangono getpriority/setpriority oppure nice.
Luca
-- 
Home: 
http://kronoz.cjb.net
Sono un mirabile incrocio tra Tarzan e Giacomo Leopardi.
In me convivono tutte le doti intelluttuali di Tarzan e
tutta la prestanza fisica di Giacomo Leopardi.
A. Borsani

 Tienici aggiornati.
Questo č semplice: 
http://wmdimp.cjb.net
 :-)
Grazie a tutti delle informazioni e dei consigli!
Daniele

 Questo è semplice: 
http://wmdimp.cjb.net
 :-)
Troppo lavoro, posta qui le news, che tanto c'è poco traffico.
-- 
  Giuseppe "Cowo" Corbelli \/\ My software: 
http://cowo.yoda2000.net
	**ANTI-SPAM** -- **Substitute IHATESPAM with cowo to reply by mail**
  -<! When you say "I wrote a program that crashed Windows", people just stare
     at you blankly and say "Hey, I got those with the system, *for free*" !>-
                                (By Linus Torvalds)