生产者消费者问题,为啥不能用一个信号量实现同步( 三 )
n = 10empty = 0mutex = 1producer: P(empty) // 1. 这里错了 P(mutex) produce(); V(mutex) V(n) // 1. 应该挪到这里 consumer: // 2. 应该挪到这里 P(n) p(mutex) consume() V(mutex) V(empty) // 2. 这里错了
empty是标记临界区有无数据的信号量,即是实现生产者和消费者同步的信号量.
它存在的意义在于: 只有当生产者生产出产品,放入缓冲区,消费者才可以取出产品
可以论证,并且它必须满足条件:
1. 必须等生产者生产的动作结束之后, 才能去修改这个信号量。
2. 必须在消费者消费的动作开始之前, 去修改这个信号量。
最好的写法应该是三个信号量,增加一个full信号量, 限制缓冲区不会溢出
■网友
我似乎想出来答案了, 如果只有一个n, P(n) == 0时则只能block 消费者, 而没有最大产品数的限制,如果生产者一直V(n)就没办法block, 就出错了。而producer的第一句:P(empty) == 0时则可以block住生产者~~~Good
■网友
生产者消费者之间有明显的同步关系。只有当生产者生产出产品,放入缓冲区,消费者才可以取出产品。而题主只用了互斥信号量,显然忽略了这种同步关系。empty和full信号量的作用是判断缓冲区是否已空或已满。
■网友
在消费者进程中n=0时P(n)被阻塞,此时指望生产者进程唤醒,因为mutex在消费者进程中执行P(n)之前的P(mutex)封锁,故生产者进程也被阻塞,此时期望消费者进程唤醒,这样两个进程都被阻塞,陷入死锁。
■网友
你的代码已经用到两个信号量了。
mutex用于互斥访问;
full(也就是第二段代码里的n)用于判空,制约消费者,这个是必须的(因为消费者不可能在没有资源的时候消费);
empty用于判满,制约生产者,可选,在无界缓冲区(缓冲区大小不限)的情况下不需要。
推荐阅读
- 江苏■江苏交控坚持问题导向、瞄准职工需求——找准“病灶”当好“产改先行官”
- 贵州在建骨干水源工程达到465座有效解决工程性区域性缺水问题
- 四川眉山瓦屋山景区就游客投诉、停车难等问题公开道歉
- 杭州已整改城市道路无障碍环境问题12467处
- 互联网怎样解决“家政服务上门速度慢”的问题
- 中东问题|
- 中国网汽车|购车2个多月、仅行驶8000多公里 宝骏730遭遇7处问题
- |沛县深入开展教育领域突出问题专项整改
- 交换机,路由器经常性的死机咋办
- 微博目前已经支持文本,图片,位置分享,为啥没有语音和视频呢微博的pm肯定想过这两种微博形态,但迟迟不做的原因到底是啥。是语音和视频不符合产
