我很难理解消费者生产者问题中的一个问题,例如下图中关于消费者简单结构的问题:
我的大问题是,在 wait(mutex) 和 signal(mutex) 中,参数 mutex 对于两者都是相同的,所以如果 signal(mutex) 被阻塞但在 wait(full) 和信号(空)它们传递不同的参数,所以信号(空)如何唤醒等待(满)??????(值得注意的是,我们假设满和空都是信号量类型)
以下是一些可能有帮助的更多信息:
生产者的代码也是:
我很难理解消费者生产者问题中的一个问题,例如下图中关于消费者简单结构的问题:
我的大问题是,在 wait(mutex) 和 signal(mutex) 中,参数 mutex 对于两者都是相同的,所以如果 signal(mutex) 被阻塞但在 wait(full) 和信号(空)它们传递不同的参数,所以信号(空)如何唤醒等待(满)??????(值得注意的是,我们假设满和空都是信号量类型)
以下是一些可能有帮助的更多信息:
生产者的代码也是:
互斥信号量处理避免对某些共享资源的相互访问,当生产者和允许消费者运行时处理完整和空信号量。这一切都取决于信号量的设置,但基本上应该设置为在消费者第一次等待时阻塞,在消费者第一次等待时应该设置为空。
然后,生产者将处理数据并在完整的信号量上发布,这反过来又会解除对消费者任务的阻塞。消费者将阻塞下一个空等待,直到生产者发布空信号量,依此类推,直到无穷大或程序结束。
任何生产者/消费者解决方案都使用缓冲区。实际的缓冲区实现需要处理具有有限大小的缓冲区。因此它需要解决两个同步问题。一个是显而易见的,当缓冲区为空时需要阻塞消费者,当一个项目进入缓冲区时再次唤醒消费者。不太明显的一点是,当缓冲区被填满时需要阻塞生产者,当消费者移除项目时需要解除阻塞。
影响不同代码段的两个非常不同的阻塞操作。因此它需要两个信号量。
这个概念纯粹基于同步。注意两件重要的事情:
1.关于full和empty:
如果缓冲区已满,生产者不能生产,如果缓冲区为空,消费者不能消费。所以,semaphore full和empty仅用于检查这个要求。请参考您的文本,空的初始值为 n(缓冲区大小),完整的初始值为 0(尚无消费者项目)。
步骤 I. Producer等待(空)检查缓冲区是否有空间(然后才生产)。
第二步。它有signal(full)来确认它已经成功地生产了一个项目。消费者现在可以消费了。
第三步。消费者有等待(完全)来检查它是否可以消费某些东西,因为每当生产者生产一个项目时,他都会确认(通过第二步)。
第四步。消费者有信号(空)来确认它已经消费了一次,因此缓冲区空间是空闲的。(再次步骤 I)。
2.关于互斥量:互斥量变量只是为了保证一次只有一个进程访问缓冲区。这就是为什么 Producer 和 Consumer 都有wait(mutex)和signal(mutex)。每当任何进程(无论是生产者还是消费者)访问缓冲区时,它都会获取mutex并且当它离开缓冲区时,它会释放mutex。