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.

È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top