Sobes.tech
Junior — Middle

Milyen következményei lesznek annak, ha ugyanazt a std::mutex-ot próbáljuk újra zárolni egy szálon belül?

sobes.tech MI

Válasz az MI-től

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

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

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

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

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