У меня вопрос о упорядочении семафоров (muxtex, empty) в задаче ограниченного буфера, показанной в книге "Концепции операционных систем" gagne. Ниже приведены два изображения кода, на который я ссылаюсь.
Первый) Ограниченный буфер.
Второй) Метод вставки.
Мой вопрос: в чем причина того, что у пользователя есть метод empty.acquire() перед mutex.acquire() в методе insert? не является ли более ясным, если mutex.acquire() приходит до empty.acquire? Я знаю с точки зрения функциональности, порядок не имеет значения. Но есть ли причина, по которой автор называет пустой.acquire перед mutex.acquire?
Порядок важен для случая, когда буфер заполнен. empty.acquire()
имеет эффект блокировки потока, пока в буфере не будет по крайней мере один свободный слот, прежде чем пытаться добавить элемент в буфер.
Если отменить, функция будет выглядеть так:
public void insert(Object item) {
mutex.acquire();
empty.acquire();
...
Если этот метод вызывается, когда буфер заполнен, mutex
будет получен, а поток заблокирован на empty.acquire()
. Затем, если другой поток вызывает remove()
чтобы освободить буферный слот, он будет блокироваться на mutex.acquire()
. Теперь новый элемент не может быть добавлен, потому что буфер заполнен и все попытки удалить объект блокируются.