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

559

input message

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

· 23.06

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

ответить

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

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

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

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

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

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

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

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