关于生产者和消费者的问题
生产者:顾名思义,生产产品的人。可以想象为工厂。
消费者: 顾名思义,消费产品的人。就像我们去买东西的时候的身份。接下来的用语可能跟一般的描述不同,目的是为了更好的理解。
在生产者消费者问题中,要设置两个信号量,一个是流水线,一个是产品。
为什么要设置两个信号量?一个不行?
在这个问题中,重点是对于生产者来说,他关心两件事:
1。流水线是否空闲。流水线不空闲代表他没地方放产品了,不能继续生产产品了,只能等流水线空出来。流水线空闲则代表他要加快进度生产产品了。
2。流水线上的产品是否已经被拿走。产品没拿走时,同样不能继续生产产品,这时候也只能等产品被拿走。产品被拿走了,那么他也要加快进度生产产品了。
同样的。对于消费者来说,他也关心两件事。
1。流水线上是否空闲。空闲的话,他就要催生产者加快进度生产。不空闲代表有产品,他应该拿走。
2。流水线上是否有产品。没有产品他就应该催生产者生产。有产品他就应该把产品拿走。
这里为什么分得那么细呢?这里可能会出现,流水线上有产品,但是没被拿走的情况。(假设流水线上只有一个产品?这种情况下流水线跟产品的关系不是绑定的吗? 对于这种情况下确实只需要设置一个信号量)对于一个流水线上能容纳多个产品的情况下,设置两个信号量是必须的。
接下来分两类情况讨论在这里用A代表流水线,B代表产品。
对于生产者来说。他要看流水线是不是空闲。要看产品是否被拿走。流水线空闲,他就要生产产品。有产品没被拿走,要提醒消费者拿走。
自然语言描述:
①生产产品
②判断流水线是否为空 P(A)p操作在这里的作用是判断流水线是否为空,不空就等,空就把产品放上流水线(对应③)。他消耗了流水线这个资源,因此用p操作。
③把产品放上流水线。把产品放在流水线,流水线上增加了产品,所以用V(B)。(对应④)
④V(B)。
⑤重复上述过程。
同理。对于消费者来说。他要看流水线是不是空闲。要看有没有产品。流水线空闲,他就要提醒生产者生产产品,有产品他要拿走。
自然语言描述:
①判断有没有产品 P(B)p操作在这里的作用是判断是否有产品,没有就等,有就把产品拿走(对应二)。他消耗了产品这个资源,因此用p操作。
②从流水线上拿下产品。
③流水线增加。他拿走了产品。流水线对应位置空闲。用V操作V(A)。
④消耗产品。
⑤重复上述过程。
上述过程中的③④能不能对换位置?个人理解可以。如果不可以的话,可能是因为防止出现,你明明消耗了产品,流水线却没有空闲出来的情况。