nel seguente codice execute_on_thread()
continuerà a stampare ". ", mentre la funzione main
attende che una condizione venga segnalata da execute_on_thread
usando pthread_cond_timedwait
. tuttavia, non è la tempistica dopo il timeout specificato 20 secondi, si mantiene solo la stampa ". "nient'altro sta accadendo.
#include <errno.h> #include <pthread.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <time.h> #include <unistd.h> #define SHOW_TECH_CMD_MAX_EXEC_TIME 5 //in secs pthread_mutex_t waitMutex = PTHREAD_MUTEX_INITIALIZER; pthread_cond_t waitCond = PTHREAD_COND_INITIALIZER; void *execute_on_thread(); void *execute_on_thread() { pthread_setcancelstate(PTHREAD_CANCEL_ENABLE, NULL); pthread_mutex_lock( &waitMutex ); while(1) { printf("."); } pthread_cond_signal( &waitCond ); pthread_mutex_unlock( &waitMutex ); return (void *) 0; } int main( ) { pthread_t tid; struct timespec ts; int error; clock_gettime(CLOCK_REALTIME, &ts); ts.tv_sec += 20; pthread_create(&tid,NULL,execute_on_thread,NULL); pthread_mutex_lock(&waitMutex); error = pthread_cond_timedwait(&waitCond, &waitMutex,&ts); pthread_mutex_unlock(&waitMutex); printf("come here 1\n"); if(error == ETIMEDOUT) { printf("come here 2\n"); error = pthread_cancel(tid); if(error != 0) { printf("come here 3\n"); } } }
En title : pthread_cond_timedwait not returning after specified timeout
date un'occhiata alla documentazione per
pthread_cond_wait
:quindi, prima che
pthread_cond_wait
ritorni, sia a causa di un segnale in arrivo o il tempismo, cerca di bloccare il mutex. ma - dal momento cheexecute_on_thread
non rilascia mai il mutex una volta che lo ha (a causa delwhile(1)
loop),pthread_cond_wait
sarà bloccato in attesa sul mutex per essere sbloccato.se ad esempio modificare il
execute_on_thread
per sbloccare temporaneamente il mutex durante ogni ciclo, si dovrebbe essere in grado di farlo funzionare. per esempio:notate però che ci sono un paio di altre cose che potrebbero essere migliorate nel vostro programma - come aggiungere una variabile guard alla vostra attesa condizionale (date un'occhiata alla variabile condition - perché chiamare pthread _ cond _ signal () prima di chiamare pthread _ cond _ wait () è un errore logico? ), aggiungendo un gestore di pulizia per assicurarsi che il mutex sia sbloccato se la richiesta di annullamento viene gestita da
execute_on_thread
quando il mutex è bloccato e modifiche simili.