Sobes.tech
Back to questions
Junior — Middle
91

Какие последствия будут иметь попытки повторной блокировки одного и того же std::mutex внутри одного потока?

Answer from AI

sobes.tech AI

Попытка повторной блокировки одного и того же std::mutex внутри одного потока приведёт к взаимной блокировке (deadlock), так как std::mutex не поддерживает рекурсивную блокировку. Поток будет ждать освобождения мьютекса, но так как он сам его уже заблокировал и не может продолжить, программа зависнет.

Если нужна возможность повторной блокировки одним и тем же потоком, следует использовать std::recursive_mutex, который позволяет одному потоку несколько раз захватывать мьютекс, но требует соответствующего количества вызовов unlock().

Пример с std::mutex приведёт к зависанию:

std::mutex mtx;
mtx.lock();
mtx.lock(); // deadlock здесь

А с std::recursive_mutex это допустимо.