pthread_cond_timedwait non ritorna dopo il timeout specificato

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

1 Comments:

  1. date un'occhiata alla documentazione per pthread_cond_wait:

    Upon successful return, the mutex shall have been locked and shall be owned by the calling thread.

    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 che execute_on_thread non rilascia mai il mutex una volta che lo ha (a causa del while(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:

    void *execute_on_thread()
    {
      pthread_setcancelstate(PTHREAD_CANCEL_ENABLE, NULL);   //Not necessary - this is the default state for new threads
      pthread_mutex_lock( &waitMutex );
      while(1)
      {
        printf(".\n");
        pthread_mutex_unlock(&waitMutex);
        usleep(100*1000);                 //So that the screen doesn't completely fill up with '.'s
        pthread_mutex_lock( &waitMutex );
      }
      pthread_cond_signal( &waitCond );
      pthread_mutex_unlock( &waitMutex );
      return (void *) 0;
    }
    

    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.

More similar articles:

  • un thread possiede un mutex dopo i tempi di pthread_cond_timedwait?
  • perché pthread_cond_timedwait non si attiva dopo il limite di tempo indicato?
  • c ++ 11 alternativa pthread_cond_timedwait
  • pthread timeout o annulla, usando pthread_cond_timedwait, o cosa?
  • cosa succede se cond viene segnalato allo stesso tempo come timeout per pthread_cond_timedwait ()
  • pthread_cond_timedwait ritorna immediatamente
  • Clock_monotonico e pthread_mutex_timedlock/pthread_cond_timedwait
  • che funzione di tempo devo usare con pthread_cond_timedwait?
  • differenza tra pthread_cond_signal prima e dopo pthread_mutex_unlock
  • pthread_cond_timedwait ret 22 ma errno ha successo
  • pthread_cond_timedwait ignora la richiesta di cancellazione
  • è corretto chiamare pthread_cond_wait () e pthread_cond_timedwait () sullo stesso condvar da thread diversi?
  • pthread_cond_timedwait non ritorna nel GHC FFI
  • pthread_cond_timedwait restituisce l'errore 454 (freebsd)
  • pthread_cond_timedwait () cause di origine di EINVAL
  • pthreads, mq_timedreceive, pthread_cond_timedwait e CLOCK_REALTIME
  • pthread_cond_timedwait () non aspetta sotto 1 secondo? (Linux)
  • non bloccare mutex per pthread_cond_timedwait e pthread_cond_signal (su Linux)
  • pthread_cond_timedwait restituisce un secondo all'inizio
  • pthread_cond_timedwait restituisce EPERM in FreeBSD
  • come usare pthread_cond_timedwait con millisecondo
  • pthread_cond_timedwait_relative_np aspetta 100ms più di quanto dovrebbe
  • pthread_cond_timedwait collegamento errore con clock_getTime su Solaris 10
  • quale thread possiede il mutex associato dopo pthread_cond_broadcast?
  • pthread_cond_timedwait appeso con gdb
  • c'è un segnale temporizzato simile a pthread_cond_timedwait?
  • pthread_cond_timedwait () in Windows
  • secondi di troppo pieno in pthread_cond_timedwait
  • quanto tempo ci vuole per un thread in attesa con pthread_cond_wait per svegliarsi dopo essere stato segnalato? come posso stimare questa volta?
  • pthread_cond_timedwait restituisce ETIMEDOUT immediatamente