【问题标题】:having hard time understanding one issue in consumer producer problem很难理解消费者生产者问题中的一个问题
【发布时间】:2013-10-29 06:22:39
【问题描述】:

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

我的大问题是,在 wait(mutex) 和 signal(mutex) 中,参数 mutex 对于两者都是相同的,所以如果 signal(mutex) 被阻塞但在 wait( full) 和 signal(empty) 它们传递不同的参数,所以 signal(empty) 如何唤醒 wait(full)??????(值得注意的是,我们假设 full 和 empty 都是信号量类型)

这里有一些可能会有所帮助的更多信息:

生产者的代码也是:

【问题讨论】:

  • 生产者的代码在哪里?
  • 看起来你是从书中得到的。这本书是怎么说的?看起来,empty 和 full 是不同的信号量/互斥体,如果你向另一个发出信号,一个不会唤醒......
  • 我把我在书中看到的所有其他信息都放在了
  • 而 full 和 empty 是不同的信号量,但你可以看到那本书声称它以这种方式工作!!!!!!!!!!!!

标签: c operating-system semaphore


【解决方案1】:

互斥信号量处理避免对某些共享资源的相互访问,当生产者和消费者被允许运行时,满信号量和空信号量处理。这一切都取决于信号量的设置,但基本上应该设置 full 以在消费者第一次等待时阻塞,empty 应该在消费者第一次等待时可用。

然后,生产者将处理数据并在完整的信号量上发布,这反过来又会解除对消费者任务的阻塞。消费者将阻塞下一个空等待,直到生产者发布空信号量,依此类推,直到无穷大或程序结束。

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      【解决方案3】:

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

      1.关于fullempty 缓冲区满了生产者不能生产,缓冲区空了消费者不能消费。因此,信号量 fullempty 仅用于检查此要求。请参考您的文本,空的初始值为 n(缓冲区大小),完整的初始值为 0(尚无消费者项目)。
      步骤 I. Producer 有 wait(empty) 检查缓冲区是否有空间(然后才生产)。
      第二步。它有 signal(full) 来确认它已经成功地生产了一个产品。消费者现在可以消费了。
      第三步。消费者有wait(full)来检查它是否可以消费某些东西,因为只要生产者生产一个项目,他就会确认(通过第二步)。
      第四步。消费者有 signal(empty) 以确认它已经消费了一次,因此缓冲区空间是空闲的。(再次第 I 步)。

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-07-27
        • 2011-08-29
        • 1970-01-01
        相关资源
        最近更新 更多