为什么信号量中同步信号量位于互斥信号量的外层?

发布于 2022-09-11 22:44:30 字数 483 浏览 27 评论 0

在看信号量解决生产者消费者问题的代码时,有个疑问:为什么同步信号量位于互斥信号量的外层?

生产者代码:

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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

长发绾君心 2022-09-18 22:44:30

先down mutex会发生死锁。
假设先down mutex,如果当前当前不为空,即empty为0,full为1,生产者和消费者有且只有一个会down成功,假如生产者down mutex成功,则它会阻塞在down empty,等待消费者消费。而另一端的消费者又在等待down mutex,这样就会发生死锁。
反过来如果生产者先down empty,就会阻塞在这里,消费者down full和down mutex都会成功,然后up empty,然后生产者就能往下执行了。

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文