|
|||||||
|
|
|
![]() |
|
|
Strumenti |
|
|
#1 |
|
Senior Member
Iscritto dal: Mar 2005
Città: ~
Messaggi: 740
|
[C Linux] Thread e segnali
Ciao gente!
Ho un'applicazione multithread, molti dei quali sono thread di servizio che, in caso di servizio momentaneamente disabilitato, fanno degli sleep anche abbastanza lunghi (es 30s) con sleep. La questione è: è possibile far "abortire" la sleep lanciando un segnale a tale thread?. es: faccio un sleep(30), ma dopo 2 sec dal lancio di usleep in uno specifico thread, dal main si scatena una condizione di uscita. La questione è che se faccio una pthread_join, devo aspettare 28 sec per la terminazione del thread (finisce il periodo di sleep, il thread si riattiva, vede la condizione di uscita e termina con la classica pthread_exit) Suggerimenti? Grazie!!!
__________________
Ciao ciao cagnolino Billy MacMini late 2009, 2.53GHz, 4GB ram, 320GB hard disk, Snow Leopard 10.8.2 - iPod Nano 6th gen. XBOX Live GamerTag: InsaneMau |
|
|
|
|
|
#2 |
|
Senior Member
Iscritto dal: Mar 2009
Città: Bologna
Messaggi: 1174
|
E usare pthread_kill?
|
|
|
|
|
|
#3 |
|
Senior Member
Iscritto dal: May 2001
Messaggi: 12966
|
La butto lì, potresti provare a fare una sleep per conto tuo usando l'api alarm() e sigaction() (effettivamente la sleep dovrebbe essere implementata così), magari la modifichi per metterla in attesa di un tuo segnale SIGUSR1.
|
|
|
|
|
|
#4 |
|
Senior Member
Iscritto dal: Mar 2005
Città: ~
Messaggi: 740
|
ok, ci provo.
già ci avevo pensato, però ho l'applicazione strutturata così tm: è il main ts: è un thread di gestione dei segnali (SIGTERM, USR1,USR2,QUIT...), fa uso della sigtimedwait td: è il thread di servizio di cui al primo posto il main parte è fa questa operazioni: Codice:
sigemptyset(&signal_set); // var globale di tipo sigset_t sigaddset(&signal_set, SIGINT); sigaddset(&signal_set, SIGTSTP); sigaddset(&signal_set, SIGCONT); sigaddset(&signal_set, SIGPIPE); sigaddset(&signal_set, SIGTERM); sigaddset(&signal_set, SIGQUIT); sigaddset(&signal_set, SIGUSR1); sigaddset(&signal_set, SIGUSR2); sigaddset(&signal_set, SIGALRM); pthread_sigmask(SIG_BLOCK, &signal_set, NULL); Ho già provato a non far gestire da ts il segnale SIGUSR1, di farlo gestire invece a td e lanciare a td con pthread_kill tale segnale dal main, ma non c'è vizio di far terminare prima del timeout la sleep/usleep già invocata da td. è questo che mi lascia perplesso: impongo a ts di non gestire usr1 ma di farlo gestire a td (chiaramente usando un altro sigset_t ) e di mandargli usr1 dal main con pthread_kill, ma non esce vivo dalla sleep se non quando scade il timeout
__________________
Ciao ciao cagnolino Billy MacMini late 2009, 2.53GHz, 4GB ram, 320GB hard disk, Snow Leopard 10.8.2 - iPod Nano 6th gen. XBOX Live GamerTag: InsaneMau |
|
|
|
|
| Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 23:36.











) e di mandargli usr1 dal main con pthread_kill, ma non esce vivo dalla sleep se non quando scade il timeout








