Wikipedia has a sample code每个人都使用。
老实说,我不明白 P,V 的事情。
先说
The consumer must wait for the producer to produce something if the queue is empty.
然后它说
Example. A single consumer enters its critical section. Since fullCount is 0, the consumer blocks.
我假设阻塞意味着等待?我的作业要求我了解这种二进制信号量的用法,然后针对不同类型的生产者-消费者问题实现解决方案。但我不知道何时递增(在 P 和 V 中设置哪个共享变量)或递减。所以我希望有知识的人能给我解释一下?如果可以的话,请把我当成非计算机专业的学生?
最佳答案
想象一下,一对夫妇搬进了一所房子。
他们有一辆装满箱子的卡车,需要卸到房子里。
所以他们决定分工。
保罗制片人说他会从卡车上取下箱子并将它们排成一行 在人行道上。
Charlie Consumer 说他会把人行道上的箱子拿走 他们进屋。
用了一段时间效果不错。但后来彼得出现了,他提出 帮助保罗兄弟。突然,人行道上堆满了箱子 查理可以接他们。他为此感到沮丧并称呼兄弟 康拉德和卡尔。但是康拉德弄伤了他的胳膊,卡尔继续玩 他的电话,所以现在:
有时生产者(保罗、彼得)的速度仍然超过消费者, 人行道上挤满了人,他们不得不站在周围拿着箱子
有时消费者(查理、康拉德、卡尔)的速度超过生产者 他们站在人行道上,而不是在家里打开行李
所以每个人都制定了一个规则:在你去那里之前检查人行道!
不幸的是,它没有帮助。保罗和彼得,清空两端 从卡车上,两人都看到了几乎满满的人行道,但足够清楚 多放一个盒子的空间。于是他们俩都拿起了一个盒子,走了过去, 然后互相碰撞(竞争条件!)。
最后 Quincy Queue 出现了。他制定了三个新规则:
保罗/彼得:你们都必须和我确认一下,以确保有 下车前的空位:
康拉德/卡尔/查理:你必须和我核实一下 在你拿起之前确保有一个盒子:
最后,因为只有我一个人,所以我无法追踪 如果不止一个人在弄乱这条线,那么即使 如果我在第 1 步或第 2 步给你开了绿灯,你仍然需要 检查以确保没有其他人在线。
所以彼得/保罗的最终规则变成了:
waitFor(spaceOnSideWalk)
waitFor(permissionToUseSideWalk))
dropBoxOnSidewalk(box)
nowSomeoneElseCanUse(permissionToUseSideWalk))
nowSomeoneElseCanUse(boxesOnSideWalk)
(和查理/卡尔/康拉德互补)
如果你想到
waitFor == decrement == P
nowSomeoneElseCanUse == increment == V
然后您将在维基百科页面上获得准确的算法。
关于algorithm - 有人可以用 P V 形式解释生产者和消费者吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13374397/