我对 gagne 的《操作系统概念》一书中所示的有界缓冲区问题中的信号量(muxtex、空)排序有疑问。 下面是我所指的代码的两张图片。
首先)有界缓冲区。
第二)插入方法。
我的问题是:在插入方法中,在mutex.acquire()之前有empty.acquire()的原因是什么? 如果 mutex.acquire() 在 empty.acquire 之前不是更清楚吗? 我知道就功能而言,顺序并不重要。但是作者在mutex.acquire之前调用empty.acquire是有原因的吗?
最佳答案
对于缓冲区已满的情况,顺序很重要。 empty.acquire()
具有阻塞线程的效果,直到缓冲区中至少有一个空闲槽,然后再尝试将一项添加到缓冲区。
如果颠倒过来,该函数将如下所示:
public void insert(Object item) {
mutex.acquire();
empty.acquire();
...
如果在缓冲区已满时调用此方法,则当线程在 empty.acquire()
上阻塞时,将获取互斥体
。然后,如果另一个线程调用 remove()
来释放缓冲区槽,它将在 mutex.acquire()
上阻塞。现在,无法添加新元素,因为缓冲区已满,所有删除对象的尝试都将被阻止。
关于java - 有界缓冲区,互斥体与空的顺序。哪一个先出现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23395545/