Семафор против Mutex в Производителе / ​​Потребителе - PullRequest
0 голосов
/ 01 сентября 2018

В задаче Продюсер-Потребитель, почему мы часто предлагают использовать для семафоров вместо использования блокировки / мьютекса?

Я не вижу веской причины использовать семафор, потому что у нас есть только 2 потока , координирующих. В этом случае блокировка кажется гораздо проще кодировать и рассуждать, потому что поток заблокирует буфер и освободит его, чтобы другой поток мог сделать то же самое. Есть только 2 потока, поэтому я не вижу использования сигнализации.

Кто-нибудь может сказать, почему предлагается использовать семафоры обычно для производителя-потребителя?

Ответы [ 3 ]

0 голосов
/ 01 сентября 2018

за то, что я понимаю.

Пожалуйста, прочтите эти два сценария.

Первый сценарий

Семафор - это ключ к твоему мотоциклу. Допустим, ваш мотоцикл имеет максимум два места. Предположим, что мотоцикл - это ресурс, а места - это два буферных пространства внутри общей памяти.

Второй сценарий

Давайте подумаем о мальчике с диареей. Он бросился в ЧР, но узнал, что его брат все еще использует комнату. Ему нужно подождать, пока его брат не закончит :). Давайте подумаем, что комната - одно большое воспоминание.

Для производителя и потребителя,

Допустим, у производителя есть магазин с х максимальным количеством товаров на каждый день.

Потребитель покупает x товаров в зависимости от наличия товара.

Это означает, что мьютекс и семафор имеют свое собственное назначение или приложение в зависимости от того, что вам нужно. Просто для идеи «производитель-потребитель» семафор победил.

0 голосов
/ 23 мая 2019

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

0 голосов
/ 01 сентября 2018

Я считаю, что причина в том, что вам нужно что-то похожее на условную переменную (а не просто мьютекс (монитор)) или спящий в цикле, который блокирует / разблокирует. Причина в том, что у вас просто нет общего ресурса, у каждого из двух потоков есть свое условие, при котором они хотят использовать ресурс (буфер заполнен, буфер пуст). Я думаю, что для такого рода проблем в целом использование семафоров предпочтительнее, чем мониторов (поскольку они могут обрабатывать более одного ресурса). Однако я не знаю, почему, в частности, семафоры являются предпочтительным решением по сравнению с мониторами для этой проблемы.

...