为什么信号量中同步信号量位于互斥信号量的外层?
在看信号量解决生产者消费者问题的代码时,有个疑问:为什么同步信号量位于互斥信号量的外层?
生产者代码:
down(&empty);
down(&mutex);
insert_item(item);
up(&mutex);
up(&full);
消费者代码:
down(&full);
down(&mutex);
item = remove_item();
up(&mutex);
up(&empty);
consume_item(item);
这两段代码都是:先down同步信号量empty/full,再down互斥信号量mutex,然后释放mutex,最后释放full/empty。为什么顺序必须要这样呢?
能不能先down互斥信号量mutex,再down同步信号量empty/full,然后释放full/empty,最后释放mutex?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
先down mutex会发生死锁。
假设先down mutex,如果当前当前不为空,即empty为0,full为1,生产者和消费者有且只有一个会down成功,假如生产者down mutex成功,则它会阻塞在down empty,等待消费者消费。而另一端的消费者又在等待down mutex,这样就会发生死锁。
反过来如果生产者先down empty,就会阻塞在这里,消费者down full和down mutex都会成功,然后up empty,然后生产者就能往下执行了。