PDA

View Full Version : [C Linux] Thread e segnali


maulattu
08-04-2009, 13:39
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? :help:

Grazie!!! :D

BrutPitt
08-04-2009, 16:15
E usare pthread_kill?

WarDuck
08-04-2009, 16:26
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.

maulattu
08-04-2009, 16:43
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:

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);

e fa subito partire ts, in seguito td.
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 :fagiano: ) e di mandargli usr1 dal main con pthread_kill, ma non esce vivo dalla sleep se non quando scade il timeout :cry: