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
repost

556

input message

напишите коммент

· 23.06

Часто дедлоки появляются в случаях, когда внутри кода блокирующего ресурс, вызывается виртуальная функция (или указатель на функцию), которая может работать с этим же ресурсом, но не напрямую, а через длинную цепочку вызовов. Поэтому внутри блоков блокировки ресурса никогда не стоит вызывать функции, реализация которых может гипотетически ссылаться на тот же ресурс

ответить

еще контент автора

войдите, чтобы увидеть

и подписаться на интересных профи

в приложении больше возможностей

пока в веб-версии есть не всё — мы вовсю работаем над ней

сетка — cоциальная сеть для нетворкинга от hh.ru

пересекайтесь с теми, кто повлияет на ваш профессиональный путь