生产者消费者问题,为啥不能用一个信号量实现同步
如果只是这样,那么这两个进程的同步关系并非生产者-消费者模型想要描述的同步关系。生产者-消费者模型中,两个进程共用临界资源,所以它们首先互斥;此外,如果缓冲区满,生产者是不能生产的,所以生产者进程受到消费者进程的制约;如果缓冲区空,消费者是不能消费的,所以消费者进程受到生产者进程的制约。但你用一个信号量去控制同步的话,因为V(n)没有条件,所以生产者进程实际上不受制约,永不阻塞,只有消费者进程受到生产者的制约。
■网友
因为有两个层面的进程间通信,一是生产者和生产者的互斥,二是生产者和消费者的同步,生产者和消费者间有内在的唤醒逻辑,所以必须要有两个信号量。如果只是用一个信号量加一个全局变量,程序不确定唤醒的是生产者还是消费者,可能会使多个线程同时进入睡眠,都不被唤醒。
■网友
如果有错欢迎讨论\u0026amp;交流!
这个操作类似于
你要在仓库堆东西。在去仓库之前先告诉其他人,仓库这块地我占了,你们别用。确保了我能放进去。真正放完之后再去告诉客户,你可以过来取了。 (反之同理)
如果只有一个inventory变量,那这两个操作就合二为一了。如果一开始就既占了位置也告诉客户可以取。那可能你还没放客户就来取了。如果你决定放完再通知,那你也不知道有没有空位可以放。
下面是我杂乱的思考步骤
我最初认为使用empty\u0026amp;full两个信号量是由于只有P,V两个函数。P(S){while(S\u0026lt;=0);S--;}V(S){S++;}可以看出 P 函数里面等待的条件是 s\u0026lt;=0, 这个可以用在互斥锁(状态不为0)和两个信号量(空位大于0,库存大于0)里面。
如果题主想要用一个量来控制,那势必这个等待的判断条件要改。比如我们用inventory来表示库存量,那对于生产者来说他需要判断的是inventory是否小于n(缓存的最大值)。我们可以加一个函数。I(S){while(S\u0026gt;n);S++;}P(S){while(S\u0026lt;=0);S--;}V(S){S++;}ini: mutex = 1 inventory = 0Producer: P(mutex) I(inventory) put into buffer V(mutex)Consumer: P(mutex) P(inventory) get from buffer V(mutex)这样的话就需要多写一个判断函数,看上去效果应该是差不多的。
但是这个代码是错的!会造成死锁!
试想一种情况,当上一个生产者正好填满了buffer,下一个获得mutex还是生产者,那他就会卡在P(inventory)这一步。由于消费者无法获得mutex(此时mutex=0),所以无法减少inventory,整个程序就卡在这里。
//PS 如果想要按照标准算法的顺序Producer: I(inventory) P(mutex) put into buffer V(mutex)Consumer: P(inventory) P(mutex) get from buffer V(mutex)就会有个新问题,即此时的inventory不能反应真实的库存量。
假设buffer已经满了,此时有一个消费者,一个生产者。消费者 P(inventory),将库存减一,生产者能通过 I(inventory)检查。然而生产者先获得mutex,向下执行。此时消费者实际上并没有将库存取走,buffer还是满的。那么这就会造成buffer溢出。
独立的Empty和Full的好处在于可以真实的反应库存情况。例如对于生产者来说,他关心的是库存空闲的空间。此处的empty就表示的是实际剩余空间-在他之前其他生产者潜在占用空间。Producer: P(Empty) P(mutex) put into buffer V(mutex) V(Full)上面这句话的意思是,如果有多个生产者,他们可能先减去了Empty空间,然后停留在 P(mutex)这一步。这就保证了生产者实际可以用的buffer一定大于等于他看到的Empty,就避免了溢出。
这个操作类似于
推荐阅读
- 江苏■江苏交控坚持问题导向、瞄准职工需求——找准“病灶”当好“产改先行官”
- 贵州在建骨干水源工程达到465座有效解决工程性区域性缺水问题
- 四川眉山瓦屋山景区就游客投诉、停车难等问题公开道歉
- 杭州已整改城市道路无障碍环境问题12467处
- 互联网怎样解决“家政服务上门速度慢”的问题
- 中东问题|
- 中国网汽车|购车2个多月、仅行驶8000多公里 宝骏730遭遇7处问题
- |沛县深入开展教育领域突出问题专项整改
- 交换机,路由器经常性的死机咋办
- 微博目前已经支持文本,图片,位置分享,为啥没有语音和视频呢微博的pm肯定想过这两种微博形态,但迟迟不做的原因到底是啥。是语音和视频不符合产
