gpt4 book ai didi

java - 有界缓冲区,互斥体与空的顺序。哪一个先出现

转载 作者:太空宇宙 更新时间:2023-11-04 06:50:14 25 4
gpt4 key购买 nike

我对 gagne 的《操作系统概念》一书中所示的有界缓冲区问题中的信号量(muxtex、空)排序有疑问。下面是我所指的代码的两张图片。

首先)有界缓冲区。

第二)插入方法。

我的问题是:在插入方法中,在mutex.acquire()之前有empty.acquire()的原因是什么?如果 mutex.acquire() 在 empty.acquire 之前不是更清楚吗?我知道就功能而言,顺序并不重要。但是作者在mutex.acquire之前调用empty.acquire是有原因的吗?

enter image description here

enter image description here

最佳答案

对于缓冲区已满的情况,顺序很重要。 empty.acquire() 具有阻塞线程的效果,直到缓冲区中至少有一个空闲槽,然后再尝试将一项添加到缓冲区。

如果颠倒过来,该函数将如下所示:

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

如果在缓冲区已满时调用此方法,则当线程在 empty.acquire() 上阻塞时,将获取互斥体。然后,如果另一个线程调用 remove() 来释放缓冲区槽,它将在 mutex.acquire() 上阻塞。现在,无法添加新元素,因为缓冲区已满,所有删除对象的尝试都将被阻止。

关于java - 有界缓冲区,互斥体与空的顺序。哪一个先出现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23395545/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com