Производитель / Потребитель с ограниченным буфером, несколько производителей / потребителей с семафорами - PullRequest
0 голосов
/ 22 января 2012

Я немного застрял в проблеме множественного потребителя / производителя. Это отражено в моих лекционных заметках, но я просто не могу понять, почему подход с одним потребителем / производителем не сработает.

Типичный подход для 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. Но теперь это означало бы, что производитель и потребитель МОГУТ быть в буфере одновременно, что недопустимо, верно?

Я действительно не понимаю: s

1 Ответ

0 голосов
/ 22 января 2012

Это решение, указанное в http://en.wikipedia.org/wiki/Producer-consumer_problem (по модулю именования).Конечно, это также означает, что вам не нужен мьютекс для версии 1P / 1C (что было бы допустимо, если бы в буфере было только 1 слот).Но это также то же решение, которое дано в http://cs.gmu.edu/cne/modules/ipc/purple/prodsem.html.

Итог: я думаю, что вы получаете это прекрасно, а кто бы ни дал вам это решение с 2 мьютексами, нет.

...