Кажется, здесь есть некоторая путаница между тем, как программа должна быть написана , и тем, как программа, как написано в данный момент, будет вести себя .
Этот код вызовет тупик, и это не означает, что с мьютексами что-то не так. Они работают точно так, как они должны: если вы попытаетесь повторно получить нерекурсивный мьютекс, который уже заблокирован, ваш код будет блокироваться до тех пор, пока мьютекс не будет разблокирован. Вот как это должно работать.
Поскольку этот код является однопоточным, блокировка в foo2
никогда не закончится, и поэтому ваша программа заблокируется и не будет прогрессировать. Скорее всего, это не то, как программа должна работать (потому что это не очень полезная программа в этом смысле). Ошибка не в том, как работают мьютексы, а в том, как программист решил использовать их. Программист должен поставить вызов разблокировки в конце foo1
.