/ / Il conflitto pthread_cond_wait e pthread_mutex_unlock? - c ++, multithreading, pthreads

Il conflitto pthread_cond_wait e pthread_mutex_unlock? - c ++, multithreading, pthreads

Sto implementando l'evento di reset manuale usando pthread in Linux, che è simile a WaitForSingleEvent in Windows. Ho trovato questo post

evento di reset manuale di windows simile a pthread

e seguilo, comunque c'è una cosa che mi confonde:

void mrevent_wait(struct mrevent *ev) {
pthread_mutex_lock(&ev->mutex);
while (!ev->triggered)
pthread_cond_wait(&ev->cond, &ev->mutex);
pthread_mutex_unlock(&ev->mutex);
}
  • pthread_cond_wait: Rilascia atomicamente il mutex e causa il blocco del thread chiamante sulla condizione variabile cond;
  • pthread_mutex_unlock: Tenta di sbloccare il mutex specificato. Se il tipo di mutex è PTHREAD_MUTEX_NORMAL, il rilevamento degli errori non viene fornito. Se un thread tenta di sbloccare un mutex che è non ha bloccato o un mutex che è sbloccato, risultati del comportamento non definiti.

Quello che mi spaventa è quando pthread_cond_wait rilascia il mutex, quindi pthread_mutex_unlock potrebbe avere un comportamento indefinito (questo genere di cose mi farebbe impazzire, come mai non ce la fanno :-D)

Grazie.

risposte:

9 per risposta № 1

Lo standard dice:

Al ritorno con successo, il mutex ha stato bloccato ed è di proprietà del chiamata thread.

Il che significa che al ritorno, pthread_cond_wait atomicamente blocca il mutex associato.

Il flusso di lavoro è così:

  • Blocca un mutex
    • pthread_cond_wait blocca e sblocca atomicamente il mutex (quindi altri thread potrebbero arrivare qui)
    • Quando arriva una condizione, pthread_cond_wait ritorna atomicamente e blocca il mutex
  • Sblocchi il mutex

Non penso blocchi pthread_cond_wait e sblocca

Questo perché non hai letto il link che ho fornito.

Queste funzioni rilasciare atomicamente mutex e causa il thread chiamante bloccare sulla condizione variabile cond;