gpt4 book ai didi

multithreading - 生产者消费者仅使用 1 个额外的信号量

转载 作者:行者123 更新时间:2023-12-04 04:29:16 25 4
gpt4 key购买 nike

Solution traditional to producer-consumer

在操作系统中,正如您在上面的生产者消费者链接中看到的,两个信号量 fullempty被使用,为什么不能只使用一个数量信号量来做到这一点 fullEmpty .

我的意思是,我们有一个二进制信号量 mutex和另一个信号量 fullEmpty ,最初是 0因为缓冲区中没有项目,所以我们为什么需要 2 个信号量 ( full , empty )?

唯一的就是wait的顺序和 signal需要更改以便更新fullEmpty位于临界区内。

有什么想法或理由吗?

最佳答案

描述中与您的答案相关的关键语句是 “我们有一个固定大小的缓冲区。”

为了回答您的问题,让我们首先假设缓冲区可以根据需要扩展以容纳尽可能多的项目,或者换句话说,缓冲区可以增长到无限大小。在这种情况下,生产者和消费者之间需要发生的唯一同步(除了锁定互斥锁以确保您不会破坏关键部分中的项目)将确保消费者仅在项目被生产后消费一个生产者。你可以只用一个互斥锁和一个信号量来解决这个问题。这是我从您共享的链接中借用并更改的一些代码:

制作人

do {
//produce an item

wait(mutex);

//place in buffer

signal(mutex);
signal(full);

} while (true);

消费者
do {
wait(full);
wait(mutex);

//remove item from buffer

signal(mutex);

//consume item

} while (true);

正如你在上面看到的,生产者总是能够向队列添加东西(除了当互斥被持有时)并且不需要等待消费者消费任何东西,因为缓冲区永远不会填满,即使消费者不消耗元素。另一方面,在生产者生产商品之前,消费者不能消费任何东西。

要回答您的问题,您需要关注“我们有一个固定大小的缓冲区”这句话。这改变了问题。由于缓冲区不再能够增长到无限大小, 您需要让生产者在缓冲区已满时等待,然后才能向缓冲区添加更多内容 .这就是为什么你需要第二个信号量。不仅消费者需要等待生产者,现在生产者也需要等待消费者。您可以通过让消费者调用 wait 来让生产者等待消费者。在只有消费者调用的信号量上 signal在。

你不能只用一个信号量来做到这一点,因为生产者必须等待的条件与消费者必须等待的条件不同。由于它们应该能够在不同条件下递减和超过信号量,因此您不能对两者使用相同的信号量。

关于multithreading - 生产者消费者仅使用 1 个额外的信号量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52157833/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com