#новичкам
Еще одна частая проблема из мира многопоточки. На канале уже много материалов про нее есть:
Определение и демонстрация
Начало серии статей про блокировку нескольких мьютексов, что часто приводит к дедлоку
Сколько нужно мьютексов, чтобы задедлокать 2 потока?
Что будет, если 2 раза подряд залочить мьютекс?
Но это все для чуть более опытных ребят. Что если вы совсем не понимаете эти потоки и мьютексы на практике, но очень хотите понять, что такое дедлок?
Есть знаменитая проблема обедающих философов. Формулируется она так:
Пять безмолвных философов сидят вокруг круглого стола, перед каждым философом стоит тарелка спагетти. На столе между каждой парой ближайших философов лежит по одной вилке.
Каждый философ может либо есть, либо размышлять. Приём пищи не ограничен количеством оставшихся спагетти — подразумевается бесконечный запас. Тем не менее, философ может есть только тогда, когда держит две вилки — взятую справа и слева.
Каждый философ может взять ближайшую вилку (если она доступна) или положить — если он уже держит её. Взятие каждой вилки и возвращение её на стол являются раздельными действиями, которые должны выполняться одно за другим.
Вопрос задачи заключается в том, чтобы разработать модель поведения, при которой ни один из философов не будет голодать, то есть будет вечно чередовать приём пищи и размышления.
В рамках этой проблемы можно продемонстрировать много проблем многопоточки, но сегодня о deadlock.
Представьте 5 философов по кругу. И у них стратегия - брать всегда первой левую вилку, а затем правую.
Что получится, если все философы одновременно возьмут левую вилку?
Никто из них никогда не поест. Для еды нужны обе вилки, а у всех по одной, все ждут освобождения правой вилки и никто никому не будет уступать. В конце концов они все дружно и помрут.
Это классический deadlock и наглядная его демонстрация. Вот так просто.
Но это данная конкретная стратегия приводит к дедлоку, есть и более оптимальные, обсуждение которых за рамками поста.
Как будто бы про дедлоки больше и не о чем писать. Если хотите разобрать какой-то их аспект - черканите в комментах.
Be unblockable. Stay cool.
#concurrency