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

新手上路,请多包涵

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

生产者代码:

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?

阅读 2.3k
1 个回答

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

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题