Dead lock

Самая известная проблема многопоточности - это Dead Lock (ситуация, когда 2 или более процесса находятся в состоянии ожидания ресурсов, занятых друг другом.

Рассмотрим пример взаимной блокировки (изображение 1)

Класс А содержит два метода f1() и f2(). Эти методы используют общие ресурсы (для простоты это переменные resource1 и resource2)

Мы видим, что при запуске программа зависла (процесс t1 захватывает мьютекс m1 и ожидает, когда освободится мьютекс m2, а этот мьютекс освободится только, когда процесс t2 освободит его, но процесс t2 ожидает, когда освободится мьютекс m1)

Решение проблемы - std::scoped_lock, который может захватывать несколько мьютексов и предотвращать дедлоки. Решение на второй картинке

Dead lock | Сетка — социальная сеть от hh.ru Dead lock | Сетка — социальная сеть от hh.ru