Рекурсивный (или реентерабельный) мьютекс — это тип примитива синхронизации, который позволяет потоку, уже владеющему мьютексом, снова заблокировать его, не вызывая взаимоблокировку.
Основные особенности:
- Многократная блокировка: Один и тот же поток может вызвать
lock() (или эквивалентную функцию) на рекурсивном мьютексе несколько раз.
- Счетчик владения: Мьютекс хранит счетчик, который увеличивается при каждом повторном захвате потоком-владельцем.
- Разблокировка: Мьютекс становится полностью свободным только после того, как поток-владелец вызовет
unlock() (или эквивалентную функцию) столько же раз, сколько было сделано блокировок.
- Неблокирующие потоки: Другие потоки, пытающиеся захватить рекурсивный мьютекс, пока он занят, будут заблокированы до тех пор, пока владеющий поток не освободит его полностью.
Использование:
- Полезен в рекурсивных функциях или при вызове методов одного объекта из другого, где оба метода требуют блокировки одного и того же мьютекса.
- Позволяет избежать взаимной блокировки в сценариях, когда поток уже держит блокировку и пытается получить ее еще раз.
Пример в C++11 с std::recursive_mutex:
c