Слишком долго для комментария, поэтому извиняюсь, что это ответ ..
IMO, любой дизайн, который требует рекурсивной блокировки, может закончить носовые демоны. Перепроектируйте ваш код так, чтобы один и тот же поток не требовал многократного получения одной и той же блокировки. Хорошей практикой IMO является никогда не вызывать публичные функции (которые должны блокироваться) из других публичных функций (которые также блокируются), и все частные функции никогда не должны блокироваться - т.е. они могут быть вызваны только публичными методами (которые заблокированы).
Так что реорганизуйте ваш код так, чтобы методы, вызываемые в контексте одного и того же потока, имели одну точку входа в ваш объект, которая затем блокировалась, и любые последующие вызовы частных функций могут работать под этой блокировкой. У этого подхода есть некоторые недостатки (например, множественные операции блокировки для последовательных вызовов функций - но если это окажется узким местом при профилировании, то примите шаблон, в котором вы открываете мьютекс с помощью члена, и, как уже упоминалось, один человек уже использует RAII для блокировки этой блокировки на время вызовов функций.)
В общем, избегайте рекурсивных мьютексов, если можете ...