algorithm - 有人可以用 P V 形式解释生产者和消费者吗?

标签 algorithm semaphore producer-consumer

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. 康拉德/卡尔/查理:你必须和我核实一下 在你拿起之前确保有一个盒子:

  3. 最后,因为只有我一个人,所以我无法追踪 如果不止一个人在弄乱这条线,那么即使 如果我在第 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/

相关文章:

algorithm - 组合问题和数值问题有什么区别

C 中具有共享内存和信号量的客户端服务器程序

javascript - 如何编写信号量检查两种不同的状态

r - R 中的信号量 (IPC)

ios - Apple doc的GCD Producer-Consumer解决方案错了吗?

performance - 在二进制搜索之前完成排序时的时间复杂度......请参阅

c++ - std::sort 将元素与 null 进行比较

带有批处理的 Java BlockingQueue?

python - 从嵌套列表构建链

C 对如何初始化和实现 pthread 互斥体和条件变量感到困惑