Системное программирование С++ / Rust
Алексей Москаленко, C++ / Python / Rust / Linux / FinTech · 21.06
Dead lock
Самая известная проблема многопоточности - это Dead Lock (ситуация, когда 2 или более процесса находятся в состоянии ожидания ресурсов, занятых друг другом.
Рассмотрим пример взаимной блокировки (изображение 1)
Класс А содержит два метода f1() и f2(). Эти методы используют общие ресурсы (для простоты это переменные resource1 и resource2)
Мы видим, что при запуске программа зависла (процесс t1 захватывает мьютекс m1 и ожидает, когда освободится мьютекс m2, а этот мьютекс освободится только, когда процесс t2 освободит его, но процесс t2 ожидает, когда освободится мьютекс m1)
Решение проблемы - std::scoped_lock, который может захватывать несколько мьютексов и предотвращать дедлоки. Решение на второй картинке
Таймураз Фардзинов
· 23.06
Часто дедлоки появляются в случаях, когда внутри кода блокирующего ресурс, вызывается виртуальная функция (или указатель на функцию), которая может работать с этим же ресурсом, но не напрямую, а через длинную цепочку вызовов. Поэтому внутри блоков блокировки ресурса никогда не стоит вызывать функции, реализация которых может гипотетически ссылаться на тот же ресурс
ответить
еще контент автора
Системное программирование С++ / Rust
Алексей Москаленко, C++ / Python / Rust / Linux / FinTech · 21.06
войдите, чтобы увидеть
и подписаться на интересных профи