gpt4 book ai didi

java - 如何防止我的程序陷入死锁但仍保持互斥? (信号量)

转载 作者:行者123 更新时间:2023-12-01 10:02:04 28 4
gpt4 key购买 nike

目前正在研究使用信号量和线程的操作系统类的作业问题。非常困惑,想知道这里是否有人可以提供帮助。我到目前为止的代码:

01 travelToShop();    //puts thread to sleep between 1 and 1000 cycles
02 s1.acquire(); //lock semaphore, keeps mutual exclusion so no other
03 //thread writes to variable while another one is trying to do the same
04
05 if (numofcust==5){ //cant have more then 5 customers in a "shop"
06 s2.acquire(); //lock the shop, wait until shop reopens
07 }
08 numofcust++; //increases variable telling class how many in shop
09 arriveAtShop(); //print statement saying ive arrived, if i arrived
10 //im technically in shop
11
12 s1.release(); //done writing to numofcust
13 sittingInShop(); //puts thread to sleep between 1 and 1000 cycles
14 //simulating having coffee
15
16 s1.acquire(); //refer to last "s1.acquire()"
17 numofcust--; //simulating leaving the shop
18 if (numofcust==0){ //if shop empty
19 s2.release(); //open the shop
20 }
21 leaveShop();
22 s1.release(); //refer to last "s1.release()"

我知道问题出在 6 号线和 12 号线。一旦店里有 5 名顾客,其余的顾客就必须等待(6 号线)。因为我必须等待,第一个获得 s1 的人正在持有另一个客户必须获取才能离开的信号量(因此没有线程可以释放该线程正在等待的锁以便该线程释放)供某人离开的锁。

我尝试过执行以下操作:

05 if (numofcust==5){    //cant have more then 5 customers in a "shop"
06 s1.release(); //release the lock so others can write to numofcust and read
07 s2.acquire(); //lock the shop, wait until shop reopens
08 s1.acquire(); //reacquire the lock so i can write to numofcust again
09 }

但后来我打破了互斥

我如何保持互斥,没有锁就没有人可以写入 numofcust,但又如何防止一个线程持有 numofcust 锁的死锁,因为它一直等待到商店开门?

编辑:如果店内有5位顾客,则店外的所有顾客都必须等到他们全部离开,但如果少于5位顾客,可以随意进去

最佳答案

您不需要两个信号量。 Semaphore 对象可以拥有可变数量的许可。有多少次许可就可以获取信号量。仅当获得所有许可时信号量才会阻塞。如果随后释放了许可证,则阻塞的线程可以唤醒并获取新释放的许可证。

许可证不属于线程。任何线程都可以释放任意数量的许可证。这为您在发放许可证时提供了很大的灵 active 。

离开时,您需要根据进入人员的高水位线来改变许可证的释放方式。当高水位线低于5时立即释放。当高水位线为 5 时,等到最后一个人离开,然后释放所有许可证。这意味着根据信号量许可分别计算商店中的人数,并在达到 5 时设置一个标志。计数和标志一次只需要由一个线程更新和检查。

关于java - 如何防止我的程序陷入死锁但仍保持互斥? (信号量),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36730324/

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