/ / Виробник / Споживач з обмеженим буфером, кілька виробників / споживачів з семафорами - синхронізація, мутекс, семафор, споживач, виробник

Виробник / споживач з обмеженим буфером, декілька виробників / споживачів з семафорами - синхронізація, mutex, семафор, споживач, виробник

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

Типовий підхід для 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.

У семафорі mutex переконайтеся, що в буфері не працює 2 процеси одночасно, тому я не бачу, як це властивість може змінитися, якщо у вас більше процесів ...

"Рішення" полягає в тому, що ви змінюєте мьютекс наProducerMutex і ConsumerMutex. Але тепер це означає, що виробник і споживач можуть бути в буфері одночасно, що не повинно бути дозволене, чи не так?

Я дійсно не отримую цього: s

Відповіді:

0 для відповіді № 1

Це рішення дається в http://en.wikipedia.org/wiki/Producer-consumer_problem (іменування по модулю). Звичайно, це також говорить про те, що вам не потрібна мьютекс для версії 1P / 1C (яка була б дійсною, якщо буфер мав лише 1 слот). http://cs.gmu.edu/cne/modules/ipc/purple/prodsem.html.

Підсумок: я думаю, що ви отримуєте це просто чудово, і кожен, хто дав вам це 2-mutex "рішення" isn "т.