我对加涅(Gagne)的《操作系统概念》(Operating Systems Concepts)一书中的有界缓冲区问题中的信号量(muxtex,空)的排序有疑问。以下是我所引用的代码的两个图像。
首先)有界缓冲区。
第二)插入方法。
我的问题是:在insert方法中的mutex.acquire()之前具有empty.acquire()的原因是什么?还不是更清楚的是,mutex.acquire()是否在empty.acquire之前?我知道就功能而言,顺序并不重要。但是作者为什么在mutex.acquire之前调用empty.acquire是有原因的?
该顺序对于缓冲区已满的情况很重要。empty.acquire()
在尝试向缓冲区中添加一项之前,具有阻塞线程的作用,直到缓冲区中至少有一个空闲插槽为止。
如果反转,该函数将如下所示:
public void insert(Object item) {
mutex.acquire();
empty.acquire();
...
如果在缓冲区已满时调用此方法,mutex
则将在线程被阻塞时获取empty.acquire()
。然后,如果另一个线程调用remove()
释放缓冲区插槽,它将阻塞on mutex.acquire()
。现在,不能添加任何新元素,因为缓冲区已满,并且所有删除对象的尝试都将阻塞。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句