Pagina 1 di 1
Sospendere l'esecuzione di un thread
Inviato: lunedì 25 febbraio 2008, 13:27
da jack84
Stò usando i pthread, vorrei sapere se qualcuno conosce un modo per sospendere l'esecuzione di un thread per un po' di tempo, una sorta di sleep insomma, però che non interviene sul processo, ma sul thread. Ho trovato una funzione sched_yield in grado di far rilasciare il processore al thread per assegnarlo ad un altro thread, ma non appena la cpu torna libera il thread viene di nuovo assegnato, invece io vorrei continui a rimanere in attesa. Qualcuno ha qualche dritta?
Re: Sospendere l'esecuzione di un thread
Inviato: lunedì 25 febbraio 2008, 14:59
da Besshell
Premettendo che non ne so molto in quanto ho solo letto qualcosa a riguardo, io ci provo a darti un consiglio...poi può darsi sia anche una cavolata..
Utilizzare pthread_join su un thread di attesa.
pthread_join infatti mi pare che aspetti l'esecuzione completa di un thread, un pò come wait nei processi.
Non chiedermi come implementare il thread di attesa che non lo so... :-[
In attesa di qualcuno sicuramente più preparato di me...
Ciao

Re: Sospendere l'esecuzione di un thread
Inviato: lunedì 25 febbraio 2008, 15:07
da difesaparcosempione
Re: Sospendere l'esecuzione di un thread
Inviato: lunedì 25 febbraio 2008, 20:42
da jack84
Ringrazio entrambi per l'aiuto e la disponibilità.
Utilizzare pthread_join su un thread di attesa.
pthread_join infatti mi pare che aspetti l'esecuzione completa di un thread, un pò come wait nei processi.
Avevo pensato anche io a qualcosa del genere, ma l'ho scartata poichè in pratica sposta il problema, che poi comunque si rivela essere sempre lo stesso cioè mettere un thread in attesa senza che gli sia assegnato il processore.
Ho trovato questo ... è in c++ ... chissà ?
Con un meccanismo del genere si potrebbe forse fare qualcosa, sospendendo l'esecuzione del thread e riattivandolo allo scadere di un timer. Mi sembra strano che però non ci sia già una funzione della libreria che implementi un meccanismo simile ???
Re: Sospendere l'esecuzione di un thread
Inviato: lunedì 25 febbraio 2008, 20:47
da Ikitt
jack84 ha scritto:
Ho trovato questo ... è in c++ ... chissà ?
Con un meccanismo del genere si potrebbe forse fare qualcosa, sospendendo l'esecuzione del thread e riattivandolo allo scadere di un timer. Mi sembra strano che però non ci sia già una funzione della libreria che implementi un meccanismo simile ???
Ci sono, le condizioni di cui sopra (e` un concetto generico, si applica bene a questo e ad altri casi). O mi sfugge qualcosa della richiesta?
Re: Sospendere l'esecuzione di un thread
Inviato: lunedì 25 febbraio 2008, 20:59
da jack84
Mi scuso se non sono stato molto chiaro, cerco di spiegarmi meglio. Ho la necessità di sospendere l'esecuzione di un thread (solo quello, non l'intero processo) per un certo lasso di tempo prestabilito (ad esempio 30 secondi). Il thread deve risvegliarsi da solo passato tempo. Non ho la nesessità di sospenderlo e riattivarlo in determinati eventi come fanno la suspend e la resume, ma semplicemente scaduto il tempo.
Re: Sospendere l'esecuzione di un thread
Inviato: lunedì 25 febbraio 2008, 21:15
da Ikitt
jack84 ha scritto:
Mi scuso se non sono stato molto chiaro, cerco di spiegarmi meglio. Ho la necessità di sospendere l'esecuzione di un thread (solo quello, non l'intero processo) per un certo lasso di tempo prestabilito (ad esempio 30 secondi). Il thread deve risvegliarsi da solo passato tempo. Non ho la nesessità di sospenderlo e riattivarlo in determinati eventi come fanno la suspend e la resume, ma semplicemente scaduto il tempo.
Beh, puoi usare i segnali (SIGALARM nella fattispecie), signal handler e pthread_sigmask e sigwait, e poi usare una pause(), ma non mi piace granche` come approccio. Oppure scartare pause() in funzione di una pthread_cond_t che sblocchi nel signal handler (ma mischiare segnali e thread non e` banalissimo); oppure ancora potresti semplicemente usare una select() senza nessun fd abilitato ma con un timer; anche nanosleep() dovrebbe andar bene se ben ricordo.
Re: Sospendere l'esecuzione di un thread
Inviato: martedì 26 febbraio 2008, 12:02
da difesaparcosempione
Infatti potresti usare la select. La uso anch'io .. anche non in ambiente multithread ... per fare sleep ...
vuoi un esempio ?
ciao
Re: Sospendere l'esecuzione di un thread
Inviato: martedì 26 febbraio 2008, 14:02
da jack84
Beh, puoi usare i segnali (SIGALARM nella fattispecie), signal handler e pthread_sigmask e sigwait, e poi usare una pause(), ma non mi piace granche` come approccio. Oppure scartare pause() in funzione di una pthread_cond_t che sblocchi nel signal handler (ma mischiare segnali e thread non e` banalissimo); oppure ancora potresti semplicemente usare una select() senza nessun fd abilitato ma con un timer; anche nanosleep() dovrebbe andar bene se ben ricordo.
Grazie per tutte le alternative che mi hai dato, cercherò la più comoda
vuoi un esempio ?
Magari! saresti gentilissimo

L'unico problema è che mi servirebbe anche una soluzione che sia portabile su windows (... e lo so comincio a rompere :P), in ogni caso la select usata per fare sleep mi incuriosisce davvero tanto

, io al massimo l'ho usata per ascoltare su più pipe con nome.
Re: Sospendere l'esecuzione di un thread
Inviato: mercoledì 27 febbraio 2008, 11:06
da difesaparcosempione
Codice: Seleziona tutto
#include <sys/types.h>
#include <sys/time.h>
#include <unistd.h>
void
sleep_us(unsigned int nusecs)
{
struct timeval tval;
tval.tv_sec = nusecs / 1000000;
tval.tv_usec = nusecs % 1000000;
select(0, NULL, NULL, NULL, &tval);
}

Per WIN non ho ideeeeee ...
ciao
ps
man 2 select