2011-10-14 11 views
8

Diciamo che avete questo codicePerché avete bisogno di un ciclo while in attesa di una condizione variabile

pthread_mutex_lock(&cam->video_lock); 
while(cam->status == WAIT_DISPLAY) // <-- Why is this a 'while' and not an 'if'? 
    pthread_cond_wait(&cam->video_cond, &cam->video_lock); 
pthread_mutex_unlock(&cam->video_lock); 

La mia domanda è, perché avete bisogno di un ciclo while qui. pthread_cond_wait non attendere fino a quando il segnale di segnalazione segnala cam_video_cond? OK, so che si potrebbe avere un caso in cui camme> Stato non è uguale a WAIT_DISPAY quando pthread_cond_wait si chiama, ma in quel caso si può solo controllare attraverso una condizione se piuttosto che utilizzare mentre.

Mi manca qualcosa qui? La mia comprensione di pthread_cond_wait è che attende infinito se cam_video_cond non è segnalato. Inoltre, sblocca il mutex cam_video_lock quando viene chiamato, ma quando viene segnalata la condizione, prima di tornare, si blocca cam_video_lock. Ho ragione?

+0

La stessa domanda qui, http://www.unix.com/programming/149791-condition-variables.html – MetallicPriest

+0

[Sveglia spuria] (http://en.wikipedia.org/wiki/Spurious_wakeup) –

risposta

17

Si raccomanda che tutte le discussioni controllare lo stato dopo il ritorno da pthread_cond_wait perché ci sono diversi motivi condizione potrebbe non essere vero. Uno di questi motivi è un wake up spurio; ovvero, un thread potrebbe essere riattivato anche se nessun thread ha segnalato la condizione .

Fonte: Spurious wakeup

2

Per motivi di prestazioni, l'API POSIX permette al sistema operativo di svegliare tuo thread, anche se la condizione non è stata soddisfatta (che si chiama un spurious wakeup).

9

wakeups spurie sono uno dei motivi, ma legittimi ma estranei wakeups sono un altro.

considerare:

  1. si mette un lavoro su una coda.

  2. si segnale la variabile di condizione, il risveglio filo A.

  3. Hai messo un lavoro su una coda.

  4. si segnale la variabile di condizione, il risveglio filo B.

  5. thread A viene programmato, fa il primo lavoro.

  6. Il thread A trova la coda non vuota e svolge il secondo lavoro.

  7. Il thread B viene pianificato, dopo essere stato svegliato, ma trova la coda ancora vuota.

Problemi correlati