Минимальное количество мьютексов для возникновения дедлока — два.
Дедлок может произойти при соблюдении четырех условий (условия Коффмана):
- Взаимное исключение (Mutual Exclusion): Ресурсы должны быть несовместно используемыми (non-shareable). В данном случае, мьютексы обеспечивают это.
- Удержание и ожидание (Hold and Wait): Процесс, уже владеющий одним мьютексом, пытается захватить еще один мьютекс, который занят другим процессом.
- Непередаваемость (No Preemption): Захваченный мьютекс не может быть принудительно отобран у процесса; он может быть освобожден только самим процессом.
- Циклическое ожидание (Circular Wait): Существует цепочка процессов, где каждый процесс ожидает мьютекс, захваченный следующим процессом в цепочке, и последний процесс в цепочке ожидает мьютекс, захваченный первым процессом.
Пример с двумя мьютексами:
c
В этом примере, если Поток 1 захватит mtx1, а Поток 2 захватит mtx2 почти одновременно, то Поток 1 будет ждать mtx2 (который занят Потоком 2), а Поток 2 будет ждать mtx1 (который занят Потоком 1). Возникает циклическое ожидание между двумя потоками и двумя мьютексами.