Системное программирование С++ / 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
войдите, чтобы увидеть
и подписаться на интересных профи