Зависание
Зависание
Что произойдет, если мы по ошибке поменяем местами вызовы Sem_wait в функции consumer (листинг 10.9)? Предположим, что первым запускается производитель (как в решении, предложенном для упражнения 10.1). Он помещает в буфер NBUFF элементов, уменьшая значение семафора nempty от NBUFF до 0 и увеличивая значение семафора nstored от 0 до NBUFF. Затем производитель блокируется в вызове Sem_wait(shared. nempty), поскольку буфер полон и помещать элементы больше некуда.
Запускается потребитель и проверяет первые NBUFF элементов буфера. Это уменьшает значение семафора nstored от NBUFF до 0 и увеличивает значение семафора nempty от 0 до NBUFF. Затем потребитель блокируется в вызове Sem_wait(shared, nstored) после вызова Sem_wait(shared, mutex). Производитель мог бы продолжать работу, поскольку значение семафора nempty уже отлично от 0, но он вызвал Sem_wait(shared, mutex) и его выполнение было приостановлено.
Это называется зависанием программы (deadlock). Производитель ожидает освобождения семафора mutex, а потребитель не снимает с него блокировку, ожидая освобождения семафора nstored. Но производитель не может изменить nstored, пока он не получит семафор mutex. Это одна из проблем, которые часто возникают с семафорами: если в программе сделать ошибку, она будет работать неправильно.
ПРИМЕЧАНИЕ
Стандарт Posix позволяет функции sem_wait обнаруживать зависание и возвращать ошибку EDEADLK, но ни одна из систем, использовавшихся для написания примеров (Digital Unix 4.0B и Solaris 2.6), не обнаружила ошибку в данном случае.
Более 800 000 книг и аудиокниг! 📚
Получи 2 месяца Литрес Подписки в подарок и наслаждайся неограниченным чтением
ПОЛУЧИТЬ ПОДАРОКДанный текст является ознакомительным фрагментом.
Читайте также
Зависание и некорректная работа программ
Зависание и некорректная работа программ Как уже упоминалось, работа программы, будь то серьезный графический пакет или простенькое приложение, зависит от множества факторов. В первую очередь – от наличия достаточного количества ресурсов, а также возможности доступа к
Зависание и некорректная работа программ
Зависание и некорректная работа программ Как уже упоминалось, работа программы, будь то серьезный графический пакет или простенькое приложение, зависит от множества факторов. В первую очередь – от наличия достаточного количества ресурсов, а также возможности доступа к
Зависание после запуска определенной программы
Зависание после запуска определенной программы Вы запускаете какую-нибудь программу, например игру, и компьютер зависает. Важно определить, зависает ли компьютер только при запуске этой программы или при запуске этого типа программ. Понимаете разницу? Может быть ошибка
Зависание компьютера после изменения конфигурации
Зависание компьютера после изменения конфигурации Под изменением аппаратной конфигурации подразумевается изменение параметров компьютера в SETUP BIOS, изменение подключения компонентов ПК внутри системного блока. Например, на моем старом компьютере были установлены две