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 № 1Lo 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;