很难理解消费者生产者问题中的一个问题

时间:2013-10-20 21:21:41

标签: c operating-system semaphore

我很难理解消费者生产者问题中的一个问题,例如下图中关于消费者的简单结构:

enter image description here

我的大问题是在等待(互斥)和信号(互斥)中,参数互斥对于两者都是相同的,因此如果信号(互斥)被阻塞但是在等待中(mutex)唤醒等待(互斥)过程是有意义的(完全)和信号(空)他们传递不同的参数,所以信号(空)可以唤醒等待(完整)??????(值得注意的是,我们假设完整和空都是信号量类型)

这里有一些可能有用的信息:

semaphore enter image description here

enter image description here

生产者的代码也是:

enter image description here

3 个答案:

答案 0 :(得分:1)

互斥量信号量处理避免对某些共享资源的相互访问,完整和空信号量在生产者和允许消费者运行时处理。这一切都取决于信号量的设置,但基本上应该设置为在消费者的第一次等待时阻止,在消费者的第一次等待时应该是空的。

然后,生产者将处理数据并在完整信号量上发布,这反过来将取消阻止消费者任务。消费者将阻止下一次空等待,直到生产者发布空信号量,依此类推,直到无限或程序结束。

答案 1 :(得分:1)

任何生产者/消费者解决方案都使用缓冲区。实际的缓冲区实现需要处理具有有限大小的缓冲区。因此需要解决两个同步问题。一个是显而易见的,消费者需要在缓冲区为空时被阻止,并在项目进入缓冲区时再次被唤醒。不太明显的一点是,当缓冲区被填充到容量时需要阻止生成器,当消费者移除项目时解除阻塞。

两个截然不同的阻塞操作会影响不同的代码段。因此需要两个信号量。

答案 2 :(得分:1)

这个概念纯粹基于同步。注意两件重要的事情:

1。关于完整为空 如果缓冲区已满,则生产者无法生成,如果缓冲区为空,则生产者无法使用。因此,信号量完整仅用于检查此要求。请参考你的文字,空的初始值是n(缓冲区的大小),full的初始值是0(消费者还没有项目)。
步骤I.生产者有等待(空)来检查缓冲区是否有空间(仅生成)。
第二步。它有信号(完整)以确认它已成功生成一个项目。消费者现在可以消费它 第三步。消费者等待(完整)以检查是否可以消费某些东西,因为生产者将生产物品,他将确认(通过步骤II)。
第四步。消费者有信号(空)以确认它已经消耗了一次,因此缓冲空间是空闲的。(再次执行步骤I)。

2.关于互斥 :互斥变量只是为了确保一次只有一个进程访问缓冲区。这就是为什么Producer和Consumer都有等待(互斥)信号(互斥)。每当任何进程(无论是生产者还是消费者)访问缓冲区时,它都会获取 mutex ,当它离开缓冲区时,它会释放 mutex