Слишком долго для комментария, так извинений это ответ ..
IMO, любая конструкция, которая требует рекурсивной блокировки, скорее всего, до конца носовых демонов. Переконфигурируйте код, чтобы одна и та же блокировка не могла быть получена несколько раз одним и тем же потоком. ИМО хорошая практика заключается в том, чтобы никогда не вызывать публичные функции (которые должны блокироваться) из других публичных функций (которые также блокируются), и все частные функции никогда не должны блокироваться, т. Е. Они могут быть вызваны только публичными методами (которые заблокированы).
Итак, переконструируйте свой код таким образом, чтобы методы, вызываемые в контексте одного потока, имели одну точку входа в ваш объект, а затем блокируются, и любые последующие вызовы частных функций могут работать под этой блокировкой. Есть некоторые недостатки в этом подходе (например, несколько операций блокировки для последовательных вызовов функций, но если это доказано как узкое место при профилировании, тогда примените шаблон, в котором вы выставляете мьютекс через члена, и, как уже упоминалось, RAII, чтобы заблокировать эту блокировку на время вызовов функций.)
все-в-все, избежать рекурсивные мьютексы, если вы можете ...
«Прочитать документацию» не является ответом на переполнение стека. –