2012-01-22 118 views
0

我有点卡在多个消费者/生产者问题。它出现在我的讲义中,但我简直不明白为什么单一消费者/生产者方法不起作用。生产者/消费者与有界缓冲区,多个生产者/消费者与信号灯

1对消费者和生产者1的典型方法是这样的:

Producer : 
    while(true) 
     emptyBuffers.P(); 
     mutex.P(); 
     buffer.insert(produced item); 
     mutex.V(); 
     fullBuffers.V(); 

Consumer : 
    while(true) 
     fullBuffers.P(); 
     mutex.P(); 
     buffer.consume(consumed item); 
     mutex.V(); 
     emptyBuffers.V(); 

为什么如果我有1个生产者和/或大于1层的消费者更本不工作?我到处寻找,但我找不到我明白的答案:s。

互斥信号灯确保没有2个进程的同时缓冲区的工作,所以我不知道如何,如果你有多个进程这个属性可以改变可能...

的“解决方案'是你将互斥锁更改为ProducerMutex和ConsumerMutex。但现在这意味着生产者和消费者可以同时进入缓冲区,这不应该被允许,对吗?

我真的没有得到这个:■

回答

0

这是在http://en.wikipedia.org/wiki/Producer-consumer_problem(模命名)给出的解决方案。当然,这也表明你不需要1P/1C版本的互斥体(如果缓冲区只有1个插槽,这将是有效的)。但它也与http://cs.gmu.edu/cne/modules/ipc/purple/prodsem.html中给出的解决方案相同。底线:我认为你得到这个很好,而且谁给你这个2互斥“解决方案”不是。

+0

这真是一个耻辱,碰巧是那位将在考试中给我评分的教授:)。尽管如此,我很高兴我没有,根据你的看法,这里错过了一些基本的方面。 Thx – bambinoh

+0

至少现在你有几个引用引用(除了我:)) –