Sospendere l'esecuzione di un thread

Linguaggi di programmazione: php, perl, python, C, bash e tutti gli altri.
Scrivi risposta
Avatar utente
jack84
Scoppiettante Seguace
Scoppiettante Seguace
Messaggi: 493
Iscrizione: lunedì 12 febbraio 2007, 11:13

Sospendere l'esecuzione di un thread

Messaggio 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?
Non sempre si può prevedere, ma ci si può sempre preparare
Avatar utente
Besshell
Scoppiettante Seguace
Scoppiettante Seguace
Messaggi: 264
Iscrizione: lunedì 9 ottobre 2006, 19:06
Località: Avellino

Re: Sospendere l'esecuzione di un thread

Messaggio 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  :)
"Vale sempre la pena di fare una domanda, ma non sempre vale la pena di dare una risposta" Oscar Wilde.
Avatar utente
jack84
Scoppiettante Seguace
Scoppiettante Seguace
Messaggi: 493
Iscrizione: lunedì 12 febbraio 2007, 11:13

Re: Sospendere l'esecuzione di un thread

Messaggio 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 ???
Non sempre si può prevedere, ma ci si può sempre preparare
Ikitt
Entusiasta Emergente
Entusiasta Emergente
Messaggi: 1816
Iscrizione: mercoledì 24 ottobre 2007, 12:05

Re: Sospendere l'esecuzione di un thread

Messaggio 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?
Avatar utente
jack84
Scoppiettante Seguace
Scoppiettante Seguace
Messaggi: 493
Iscrizione: lunedì 12 febbraio 2007, 11:13

Re: Sospendere l'esecuzione di un thread

Messaggio 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.
Non sempre si può prevedere, ma ci si può sempre preparare
Ikitt
Entusiasta Emergente
Entusiasta Emergente
Messaggi: 1816
Iscrizione: mercoledì 24 ottobre 2007, 12:05

Re: Sospendere l'esecuzione di un thread

Messaggio 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.
Avatar utente
difesaparcosempione
Rampante Reduce
Rampante Reduce
Messaggi: 6031
Iscrizione: giovedì 27 luglio 2006, 19:06
Località: Torino
Contatti:

Re: Sospendere l'esecuzione di un thread

Messaggio da difesaparcosempione »

Infatti potresti usare la select. La uso anch'io .. anche non in ambiente multithread ... per fare sleep ...
:)

vuoi un esempio ?
ciao
Avatar utente
jack84
Scoppiettante Seguace
Scoppiettante Seguace
Messaggi: 493
Iscrizione: lunedì 12 febbraio 2007, 11:13

Re: Sospendere l'esecuzione di un thread

Messaggio 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  ;D
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.
Ultima modifica di jack84 il martedì 26 febbraio 2008, 14:10, modificato 1 volta in totale.
Non sempre si può prevedere, ma ci si può sempre preparare
Avatar utente
difesaparcosempione
Rampante Reduce
Rampante Reduce
Messaggi: 6031
Iscrizione: giovedì 27 luglio 2006, 19:06
Località: Torino
Contatti:

Re: Sospendere l'esecuzione di un thread

Messaggio 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);
}
;D
Per WIN non ho ideeeeee ...
ciao
ps  man 2 select
Scrivi risposta

Ritorna a “Programmazione”

Chi c’è in linea

Visualizzano questa sezione: 0 utenti iscritti e 4 ospiti