POSIX consente ai mutex di essere ricorsivi. Ciò significa che lo stesso thread può bloccare lo stesso mutex due volte e non si bloccherà. Ovviamente deve anche sbloccarlo due volte, altrimenti nessun altro thread può ottenere il mutex. Non tutti i sistemi che supportano pthread supportano anche i mutex ricorsivi, ma se vogliono essere conformi a POSIX, devono farlo .
Altre API (API di livello più elevato) di solito offrono anche mutex, spesso chiamati Lock. Alcuni sistemi / linguaggi (ad esempio Cocoa Objective-C) offrono mutex sia ricorsivi che non ricorsivi. Alcune lingue offrono anche solo l'una o l'altra. Ad esempio, in Java i mutex sono sempre ricorsivi (lo stesso thread può "sincronizzare" due volte sullo stesso oggetto). A seconda delle altre funzionalità di thread che offrono, non avere mutex ricorsivi potrebbe non essere un problema, in quanto possono essere facilmente scritti da soli (ho già implementato me stesso mutex ricorsivi sulla base di operazioni mutex / condition più semplici).
Cosa non capisco davvero: a cosa servono i mutex non ricorsivi? Perché dovrei avere un deadlock di thread se blocca lo stesso mutex due volte? Anche i linguaggi di alto livello che potrebbero evitarlo (ad esempio test se questo si bloccherà e genererà un'eccezione se lo fa) di solito non lo fanno. Lasceranno invece il deadlock del thread.
Questo è solo per i casi, in cui lo blocco accidentalmente due volte e lo sblocco solo una volta e in caso di un mutex ricorsivo, sarebbe più difficile trovare il problema, quindi invece ho immediatamente un deadlock per vedere dove appare il blocco errato? Ma non posso fare lo stesso con un contatore dei blocchi restituito durante lo sblocco e in una situazione in cui sono sicuro di aver rilasciato l'ultimo blocco e il contatore non è zero, posso lanciare un'eccezione o registrare il problema? O c'è qualche altro caso d'uso più utile di mutex non ricorsivi che non riesco a vedere? O è forse solo una prestazione, poiché un mutex non ricorsivo può essere leggermente più veloce di uno ricorsivo? Tuttavia, l'ho provato e la differenza non è poi così grande.