POSIX дозволяє мютексам бути рекурсивними. Це означає, що однаковий потік може двічі заблокувати один і той самий файловий файл і не матиме тупикової ситуації. Звичайно, його також потрібно розблокувати двічі, інакше жодна інша нитка не зможе отримати мутекс. Не всі системи, що підтримують pthreads, також підтримують рекурсивні мютекси, але якщо вони хочуть відповідати POSIX, вони повинні .
Інші API (більш API API високого рівня) також зазвичай пропонують мутекси, які часто називають Locks. Деякі системи / мови (наприклад, Cocoa Objective-C) пропонують як рекурсивні, так і нерекурсивні мутекси. Деякі мови також пропонують лише ту чи іншу. Напр., У мутексах Java завжди рекурсивні (одна і та ж нитка може двічі "синхронізуватися" на одному об'єкті). Залежно від того, яку іншу функціональність потоку вони пропонують, відсутність рекурсивних мютексів може не бути проблемою, оскільки їх можна легко записати самостійно (я вже реалізував рекурсивні мютекси самостійно на основі більш простих операцій mutex / condition).
Що я насправді не розумію: для чого корисні нерекурсивні мютекси? Чому я хотів би мати тупик потоку, якщо він двічі блокує ту саму мутекс? Навіть мови високого рівня, які могли б цього уникнути (наприклад, тестування, якщо це буде тупиком та викиданням винятку, якщо він є), зазвичай цього не роблять. Вони натомість пустять нитку в глухий кут.
Це лише для тих випадків, коли я випадково заблокував його двічі і розблокував лише один раз, а у випадку рекурсивної мютексу було б важче знайти проблему, тож натомість у мене є тупик негайно, щоб побачити, де з’являється неправильний замок? Але хіба я не міг би зробити те саме, щоб лічильник блокування повернувся під час розблокування та в ситуації, коли я впевнений, що випустив останній замок, а лічильник не дорівнює нулю, я можу викинути виняток або зареєструвати проблему? Або є якісь більш корисні випадки використання нерекурсивних мютексів, які я не бачу? Або це може бути просто продуктивність, оскільки нерекурсивна мютекс може бути трохи швидшою, ніж рекурсивна? Однак я тестував це, і різниця насправді не така вже й велика.