Ограниченный буфер, порядок мьютекса против пустого. который приходит первым

1

У меня вопрос о упорядочении семафоров (muxtex, empty) в задаче ограниченного буфера, показанной в книге "Концепции операционных систем" gagne. Ниже приведены два изображения кода, на который я ссылаюсь.

Первый) Ограниченный буфер.

Второй) Метод вставки.

Мой вопрос: в чем причина того, что у пользователя есть метод empty.acquire() перед mutex.acquire() в методе insert? не является ли более ясным, если mutex.acquire() приходит до empty.acquire? Я знаю с точки зрения функциональности, порядок не имеет значения. Но есть ли причина, по которой автор называет пустой.acquire перед mutex.acquire?

Изображение 174551

Изображение 174551

Теги:
multithreading
semaphore
mutex

1 ответ

1
Лучший ответ

Порядок важен для случая, когда буфер заполнен. empty.acquire() имеет эффект блокировки потока, пока в буфере не будет по крайней мере один свободный слот, прежде чем пытаться добавить элемент в буфер.

Если отменить, функция будет выглядеть так:

public void insert(Object item) {
    mutex.acquire();
    empty.acquire();
    ...

Если этот метод вызывается, когда буфер заполнен, mutex будет получен, а поток заблокирован на empty.acquire(). Затем, если другой поток вызывает remove() чтобы освободить буферный слот, он будет блокироваться на mutex.acquire(). Теперь новый элемент не может быть добавлен, потому что буфер заполнен и все попытки удалить объект блокируются.

  • 0
    Спасибо! это именно то, что мне нужно!

Ещё вопросы

Сообщество Overcoder
Наверх
Меню