Зависание

Зависание

Что произойдет, если мы по ошибке поменяем местами вызовы 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), не обнаружила ошибку в данном случае.

Поделитесь на страничке

Следующая глава >

Похожие главы из других книг

Зависание и некорректная работа программ

Из книги Сбои и ошибки ПК. Лечим компьютер сами. Начали! автора Ташков Петр

Зависание и некорректная работа программ Как уже упоминалось, работа программы, будь то серьезный графический пакет или простенькое приложение, зависит от множества факторов. В первую очередь – от наличия достаточного количества ресурсов, а также возможности доступа к


Зависание после запуска определенной программы

Из книги Очень хороший самоучитель пользователя компьютером. Как самому устранить 90% неисправностей в компьютере и увеличить его возможности автора Колисниченко Денис Николаевич

Зависание после запуска определенной программы Вы запускаете какую-нибудь программу, например игру, и компьютер зависает. Важно определить, зависает ли компьютер только при запуске этой программы или при запуске этого типа программ. Понимаете разницу? Может быть ошибка


Зависание компьютера после изменения конфигурации

Из книги Сбои и ошибки ПК. Лечим компьютер сами автора Донцов Дмитрий

Зависание компьютера после изменения конфигурации Под изменением аппаратной конфигурации подразумевается изменение параметров компьютера в SETUP BIOS, изменение подключения компонентов ПК внутри системного блока. Например, на моем старом компьютере были установлены две


Зависание и некорректная работа программ

Из книги автора

Зависание и некорректная работа программ Как уже упоминалось, работа программы, будь то серьезный графический пакет или простенькое приложение, зависит от множества факторов. В первую очередь – от наличия достаточного количества ресурсов, а также возможности доступа к