3

维基百科有一个每个人都使用的示例代码

老实说,我不明白P,V的事情。

它首先说

如果队列为空,消费者必须等待生产者生产一些东西。

但后来它说

例子。单个消费者进入其临界区。由于 fullCount 为 0,因此消费者阻塞。

我认为阻塞意味着等待?我的作业要求我了解这种二进制信号量的使用,然后为不同类型的生产者-消费者问题实施解决方案。但是我不知道何时增加(在 P 和 V 中设置哪个共享变量)或减少。所以希望有懂行的可以给我解释一下?如果可以的话,把我当成非cs学生吗?

4

2 回答 2

3

想象一下几个人搬进一所房子。

他们有一辆装满箱子的卡车,需要卸到房子里。

于是他们决定分工。

  • Paul Producer 说他会从卡车上取下箱子,然后在人行道上排成一排。

  • Charlie Consumer 说他会把箱子从人行道上拿走,然后带回家。

它运行良好一段时间。但随后彼得出现了,他主动提出帮助保罗弟兄。突然,人行道上堆满了箱子,查理还没来得及捡起它们。他对此感到沮丧,并打电话给康拉德和卡尔兄弟。但是康拉德伤了他的胳膊,卡尔一直在玩他的手机,所以现在:

  • 有时生产者(保罗、彼得)的速度仍然超过消费者,人行道上挤满了人,人们不得不拿着盒子站在周围

  • 有时消费者(查理、康拉德、卡尔)的速度超过了生产者,他们站在人行道上而不是在家里拆包

所以每个人都制定了一个规则:去之前检查人行道!

不幸的是,它没有帮助。保罗和彼得在卡车的两端清空,两人都看到一条几乎满员的人行道,但显然有足够的空间再放一个箱子。所以他们俩都捡起一个盒子,走过去,然后互相撞在一起(比赛条件!)。

最后昆西队列出现了。他制定了三个新规则:

  1. 保罗/彼得:你们俩都必须和我核实,以确保在你下车之前有一个空位:

  2. 康拉德/卡尔/查理:你必须先和我核实一下,确保在你取货之前有一个盒子:

  3. 最后,因为只有我一个人,如果不止一个人在搞乱线路,我无法跟踪这一点。所以即使我在第 1 步或第 2 步给了你绿灯,你仍然需要检查确保没有其他人在线。

所以彼得/保罗的最终规则变成:

waitFor(spaceOnSideWalk)
waitFor(permissionToUseSideWalk))
dropBoxOnSidewalk(box)
nowSomeoneElseCanUse(permissionToUseSideWalk))
nowSomeoneElseCanUse(boxesOnSideWalk)

(和查理/卡尔/康拉德互补)

如果你想到

waitFor == decrement == P
nowSomeoneElseCanUse == increment == V

然后,您将在维基百科页面上获得准确的算法。

于 2012-11-14T07:52:26.083 回答
1

如果 fullCount 信号量为 0 并且消费者执行 P(fullCount),它将阻塞(等待)直到生产者通过执行 V(fullCount) 增加信号量。

消费者和生产者都使用 P(useQueue) 来确保他们拥有更改队列的专有权利。完成更改后,他们将执行 V(useQueue) 再次释放队列。

如果这不能回答您的问题,我认为您需要更好地说明您的问题。

于 2012-11-14T07:24:23.550 回答