老实说,我没有得到P,V的东西。
首先说
消费者必须等待生产者生产一些东西 队列是空的。
然后它说
实施例。单个消费者进入其关键部分。以来 fullCount为0,消费者阻止。
我认为阻止意味着等待?我的作业要求我理解这种二进制信号量的使用,然后针对不同类型的生产者 - 消费者问题实施解决方案。但是我没有得到何时增加(在P和V中设置哪个共享变量)或减少。所以我希望知识渊博的人可以向我解释一下?如果可能的话,像对待非学生一样对待我?
答案 0 :(得分:3)
他们有一辆满载箱子的卡车需要卸载到房子里。
所以他们决定分开工作。
Paul Producer说他会从卡车上取下盒子并将它们排好 在人行道上。
查理消费者说他会从人行道上拿走箱子拿走 他们进了房子。
它运作良好一段时间。然后彼得出现了,他提出要 帮兄弟保罗。突然,人行道上装满了箱子 查理可以接他们。他对此感到沮丧,并打电话给兄弟 康拉德和卡尔。但康拉德伤了他的胳膊,卡尔一直在玩 他的电话,现在:
有时候制片人(保罗,彼得)仍然超过消费者, 人行道很满,人们不得不站在一边拿着箱子
有时消费者(charlie,conrad,carl)超过了生产者 他们站在人行道上,而不是在家打开包装
所以每个人都制定规则:在去那儿之前检查人行道!
不幸的是,它没有帮助。保罗和彼得,排空了两端 卡车,两人都看到了几乎完整的人行道,但显然足够了 一个盒子的空间。所以他们都摘了一个盒子,走过去, 然后互相哄骗(竞争条件!)。
最后Quincy Queue出现了。他制定了三条新规则:
保罗/彼得:你们两个都要和我核实,以确保有 在您下车前的空位:
康拉德/卡尔/查理:你必须和我一起检查 确保在您拿起之前有一个方框:
最后,因为我只有一个人,所以我无法跟踪 如果不止一个人弄乱了这条线,那就算了 如果我在步骤1或2中给你一个绿灯,你仍然需要 检查以确保没有其他人在线。
所以彼得/保罗的最终规则变成了:
waitFor(spaceOnSideWalk)
waitFor(permissionToUseSideWalk))
dropBoxOnSidewalk(box)
nowSomeoneElseCanUse(permissionToUseSideWalk))
nowSomeoneElseCanUse(boxesOnSideWalk)
(与查理/卡尔/康拉德互补)
如果你想到
waitFor == decrement == P
nowSomeoneElseCanUse == increment == V
然后你就会在维基百科页面上找到完全相同的算法。
答案 1 :(得分:1)
如果fullCount信号量为0且消费者执行P(fullCount),它将阻塞(等待),直到生产者通过执行V(fullCount)来增加信号量。
消费者和生产者都使用P(useQueue)来确保他们拥有更改队列的专有权。完成更改后,他们将执行V(useQueue)再次释放队列。如果这不能回答你的问题,我认为你需要更好地指明你的问题。