Middle+
151
questionbank
Что такое рекурсивный мьютекс?
Ответ от нейросети
sobes.tech AI
Рекурсивный (или реентерабельный) мьютекс — это тип примитива синхронизации, который позволяет потоку, уже владеющему мьютексом, снова заблокировать его, не вызывая взаимоблокировку.
Основные особенности:
- Многократная блокировка: Один и тот же поток может вызвать
lock()(или эквивалентную функцию) на рекурсивном мьютексе несколько раз. - Счетчик владения: Мьютекс хранит счетчик, который увеличивается при каждом повторном захвате потоком-владельцем.
- Разблокировка: Мьютекс становится полностью свободным только после того, как поток-владелец вызовет
unlock()(или эквивалентную функцию) столько же раз, сколько было сделано блокировок. - Неблокирующие потоки: Другие потоки, пытающиеся захватить рекурсивный мьютекс, пока он занят, будут заблокированы до тех пор, пока владеющий поток не освободит его полностью.
Использование:
- Полезен в рекурсивных функциях или при вызове методов одного объекта из другого, где оба метода требуют блокировки одного и того же мьютекса.
- Позволяет избежать взаимной блокировки в сценариях, когда поток уже держит блокировку и пытается получить ее еще раз.
Пример в C++11 с std::recursive_mutex:
#include <mutex>
#include <thread>
#include <iostream>
std::recursive_mutex recursiveMutex;
void recursiveFunction(int depth) {
recursiveMutex.lock(); // Повторная блокировка
if (depth > 0) {
std::cout << "Thread ID: " << std::this_thread::get_id() << ", Depth: " << depth << std::endl;
recursiveFunction(depth - 1); // Рекурсивный вызов
}
recursiveMutex.unlock(); // Разблокировка
}
int main() {
std::thread t(recursiveFunction, 3);
t.join();
return 0;
}