Pthread_mutex_lock () sblocco prima di pthread_cond_wait () sblocca?
-
13-12-2019 - |
Domanda
Immagina un blocco filettatura su una variabile di condizione:
pthread_mutex_lock (mutex);
do_something ();
pthread_cond_wait(cond, mutex); // [1]
do_something_else ();
pthread_mutex_unlock (mutex);
.
Il mutex è sbloccato e un filo diverso che prova a bloccare il mutex è sbloccato:
pthread_mutex_lock (mutex);
do_some_work ();
pthread_cond_signal (cond);
pthread_mutex_unlock (mutex);
.
Allo stesso tempo c'è un altro thread in attesa di acquisire la proprietà della sezione critica:
pthread_mutex_lock (mutex); // [2]
do_some_random_work ();
pthread_mutex_unlock (mutex);
.
Ora, la domanda è: Quando viene chiamato pthread_cond_signal (), è garantito che il pthread_cond_wait () [1] sblocca prima di pthread_mutex_lock () [2]?
La specifica POSIX sembra non dire nulla del caso.
Soluzione
No, non è.
Descrizioni di pthread_cond_signal () a volte sono formulate come
.Quando ogni filettatura non è stata sbloccata come risultato di un pthread_cond_signal () o pthread_cond_broadcast () ritorna dalla sua chiamata a pthread_cond_wait () o pthread_cond_timedwait (), il thread possiede il mutex con cui ha chiamato pthread_cond_wait () o pthread_cond_timedwait ().Il / i thread (s) che sono uno scontento sbloccato per il mutex in base alla politica di pianificazione (se applicabile), e come se ognuno avesse chiamato pthread_mutex_lock ().
(preso da Questo link )
Come puoi vedere, è formulato come "come se ognuno avesse chiamato pthread_mutex_lock ()".Pertanto, non vi è una priorità di questa chiamata Pthread_Mutex_Lock implicita rispetto a una chiamata Pthread_Mutex_Lock effettiva da un altro filo.