我有一个关于信号量(muxtex,空)在有限缓冲问题中的排序的问题,该问题出现在书#34;操作系统概念"加涅。 以下是我所指的代码的两个图像。
首先是有界缓冲区。
第二)插入方法。
我的问题是:在insert方法中使用mutex.acquire()之前的empty.acquire()是什么原因? 如果mutex.acquire()在empty.acquire之前出现,那么更清楚吗? 我知道在功能方面,顺序并不重要。但是有没有理由为什么作者在mutex.acquire之前调用empty.acquire?
答案 0 :(得分:1)
顺序对于缓冲区已满的情况很重要。 empty.acquire()
具有阻塞线程的效果,直到在尝试将项添加到缓冲区之前缓冲区中至少有一个空闲槽。
如果相反,该功能将如下所示:
public void insert(Object item) {
mutex.acquire();
empty.acquire();
...
如果在缓冲区已满时调用此方法,则会在mutex
上阻止线程时获取empty.acquire()
。然后,如果另一个线程调用remove()
来释放缓冲区槽,它将在mutex.acquire()
上阻塞。现在,不能添加任何新元素,因为缓冲区已满并且所有删除对象的尝试都将被阻止。