2014-11-07 17 views
28
class AAA 
{ 
    ... 
    ~AAA() 
    { 
     pthread_mutex_lock(&m_mutex); 
     pthread_mutex_destroy(&m_mutex); 
    } 
} 

Domanda> Ho visto questo codice da qualche parte in un progetto. È buona pratica farlo? Oppure è un comportamento non definito bloccare un mutex prima di distruggerlo?È buona norma bloccare un mutex pthread prima di distruggerlo?

+12

Se si sente il bisogno di bloccarlo, dovrebbe implicare che un altro thread potrebbe tentare di richiederlo. Cosa succederebbe a quel thread quando il mutex fu distrutto ?. –

+0

@JanPetterJetmundsen, non ho scritto il codice e ho bisogno di capirne il motivo. – q0987

+1

Non è definito. @JanPetterJetmundsen ha ragione. Non è una buona pratica bloccare il mutex prima di distruggerlo, anche se nella maggior parte delle implementazioni non fa nulla di sbagliato. –

risposta

35

Mi sembra una pratica assolutamente terribile.

da http://pubs.opengroup.org/onlinepubs/009695399/functions/pthread_mutex_destroy.html

Sarà sicuro per distruggere un mutex inizializzato che è sbloccato. Il tentativo di distruggere un mutex bloccato provoca un comportamento indefinito.

quindi questo codice garantisce un comportamento non definito e deve essere risolto.

+3

Per completezza, la man-page aggiornata: http://pubs.opengroup.org/onlinepubs/9699919799/functions/pthread_mutex_destroy.html – alk

+0

Si noti inoltre che in base a tale pagina man, tentando di * bloccare * a * distrutto * mutex produce anche un comportamento indefinito. (Se c'è qualche ragione per bloccare questo mutex, significa che anche un altro thread potrebbe provare a bloccarlo.) –

6

Questo link dice il suo comportamento non definito.

Forse da dove hai visto questo codice, il codificatore originale voleva distruggere il mutex e avrebbe potuto pensare che se fosse stato in grado di bloccare quel mutex, allora significa che è stato sbloccato da qualche altra parte da qualche thread importante, e quindi può cancellarlo.

Ma è stato implementato in modo errato.

Problemi correlati