0

Dead lock

Перед тем, как разобрать, что такое live lock, вспомним, что такое dead lock.

Deadlock bug на простейшем примере
Два потока захватывают мьютексы в разном порядке. Это может привести к ситуации, что планировщик запустит на выполнение поток 1, поток 1 захватит мьютекс 1, после чего планировщик приостановит выполнение потока 1 и запустит на выполнение поток 2. Поток 2 захватит мьютекс 2. Независимо от того, какой поток будет выполняться дальше, программа зависнет, т.к. потоки будут ждать разблокировки мьютексов (поток 1 - мьютека 2, поток 2 - мьютека 1), которая никогда не произойдет.

#include <iostream>
#include <thread>
#include <mutex>

void thread1(std::mutex& mutex1, std::mutex& mutex2)
{
std::lock_guard<std::mutex> lock1(mutex1);
std::cout << "Thread 1 acquired mutex1\n";

std::lock_guard<std::mutex> lock2(mutex2);
std::cout << "Thread 1 acquired mutex2\n";
}

void thread2(std::mutex& mutex1, std::mutex& mutex2)
{
std::lock_guard<std::mutex> lock2(mutex2);
std::cout << "Thread 2 acquired mutex2\n";

std::lock_guard<std::mutex> lock1(mutex1);
std::cout << "Thread 2 acquired mutex1\n";
}

int main()
{
std::mutex mutex1;
std::mutex mutex2;

std::thread t1(thread1, std::ref(mutex1), std::ref(mutex2));
std::thread t2(thread2, std::ref(mutex1), std::ref(mutex2));

t1.join();
t2.join();
}

Fix dead lock bug
В современном C++ баг, описанный выше, исправляется с помощью использования std::scoped_lock

#include <iostream>
#include <thread>
#include <mutex>

void thread1(std::mutex& mutex1, std::mutex& mutex2)
{
const std::scoped_lock lock(mutex1, mutex2);
std::cout << "Thread 1 acquired mutex1 and mutex2\n";
}

void thread2(std::mutex& mutex1, std::mutex& mutex2)
{
const std::scoped_lock lock(mutex1, mutex2);
std::cout << "Thread 2 acquired mutex1 and mutex2\n";
}

int main()
{
std::mutex mutex1;
std::mutex mutex2;

std::thread t1(thread1, std::ref(mutex1), std::ref(mutex2));
std::thread t2(thread2, std::ref(mutex1), std::ref(mutex2));

t1.join();
t2.join();
}

Больше технических постов тут t.me/neverending_cpp

Лига программистов

2.1K постов11.9K подписчик

Правила сообщества

- Будьте взаимовежливы, аргументируйте критику

- Приветствуются любые посты по тематике программирования

- Если ваш пост содержит ссылки на внешние ресурсы - он должен быть самодостаточным. Вариации на тему "далее читайте в моей телеге" будут удаляться из сообщества

Автор поста оценил этот комментарий

Констуктивно тут можно сказать, что ваш пример зачем-то истользует 2 мьютекса вместо одного. Казалось бы, просто сотрите один из них. Но нет, вам нужно заблокировать именно два одновременно. Вижу цель - не вижу препятствий.

+ Бессмысленное использование std::ref.

раскрыть ветку (1)
0
Автор поста оценил этот комментарий

Это демо пример, в нем нет полезной нагрузки, два мьютекса нужны для демонстрации взаимоблокировки. Поэтому "сотрите один из них" неприменимо.


Увы, комментарий про std::ref я не понял. Просьба привести код с "осмысленным" использованием std::ref в контексте моего примера.

показать ответы
0
Автор поста оценил этот комментарий

Я про картинку а не про ваш код, если что.

раскрыть ветку (1)
0
Автор поста оценил этот комментарий

Эх, а я так надеялся на конструктивную беседу))

0
Автор поста оценил этот комментарий

рискну предположить, проблема тут заключается в том, что ни один из тредов не следит за состоянием семафора.

раскрыть ветку (1)
Автор поста оценил этот комментарий

А как по вашему можно исправить код, чтобы тред следил за состоянием семафора? Можете прям пример кода прислать.

показать ответы
Автор поста оценил этот комментарий
Для демонстрации мьютекса нужен какой-никакой блок, который он защищают. Пусть "игрушечный" с cout. А блок у вас один, так зачем два мьютекса? Ах, читатель должен додумать! так что ж у вас-то не получилось додумать, зачем их там два?
раскрыть ветку (1)
Автор поста оценил этот комментарий

Если убрать непонятную токсичность из ваших сообщений, в них даже есть здравое зерно. Увы, из-за вашего стиля общения серьёзно относиться к вашим сообщениям не получается))) Попробуйте ещё раз на примере std::ref=)

Темы

Политика

Теги

Популярные авторы

Сообщества

18+

Теги

Популярные авторы

Сообщества

Игры

Теги

Популярные авторы

Сообщества

Юмор

Теги

Популярные авторы

Сообщества

Отношения

Теги

Популярные авторы

Сообщества

Здоровье

Теги

Популярные авторы

Сообщества

Путешествия

Теги

Популярные авторы

Сообщества

Спорт

Теги

Популярные авторы

Сообщества

Хобби

Теги

Популярные авторы

Сообщества

Сервис

Теги

Популярные авторы

Сообщества

Природа

Теги

Популярные авторы

Сообщества

Бизнес

Теги

Популярные авторы

Сообщества

Транспорт

Теги

Популярные авторы

Сообщества

Общение

Теги

Популярные авторы

Сообщества

Юриспруденция

Теги

Популярные авторы

Сообщества

Наука

Теги

Популярные авторы

Сообщества

IT

Теги

Популярные авторы

Сообщества

Животные

Теги

Популярные авторы

Сообщества

Кино и сериалы

Теги

Популярные авторы

Сообщества

Экономика

Теги

Популярные авторы

Сообщества

Кулинария

Теги

Популярные авторы

Сообщества

История

Теги

Популярные авторы

Сообщества