Модель производитель-потребитель - бинарный семафор или мьютекс? - PullRequest
5 голосов
/ 22 октября 2010

Речь идет главным образом о понимании концепции, которая меня смущает.

Mutex означает, что один поток получает контроль доступа к общему ресурсу, выполняет операции и разблокирует его, тогда только другой поток может получить доступ к блокировке

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

В последнем вопросе, который я видел над здесь , было упомянуто, что "semaphores are more suitable for some synchronization problems like producer-consumer".

Мой вопрос это, например, если поток производителя получил блокировку и заполнил некоторую очередь данными, а потребитель одновременно разблокировал ее, разве нет проблемы параллелизма ??

1 Ответ

11 голосов
/ 23 октября 2010

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

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

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

A двоичный семафор - это способ принудительного взаимного исключения. Всякий раз, когда процесс хочет получить доступ к мьютексу, он может получить семафор. Эта операция будет заблокирована, если в этот момент есть другой процесс, удерживающий семафор. Следовательно, у нас есть взаимное исключение. Когда процесс завершен с мьютексом, мы освобождаем семафор, позволяя другим процессам войти в мьютекс. Таким образом, мы можем добиться взаимного исключения с помощью двоичного семафора, но это ни в коем случае не единственное возможное применение двоичного семафора.

Семафоры хороши для задач производителя-потребителя, потому что они могут принимать произвольное натуральное число, а не только 0 и 1 в случае двоичных семафоров. Это очень полезно при синхронизации проблем производителя и потребителя, поскольку вы можете позволить значению семафора содержать количество доступных элементов. Если количество элементов уменьшается до нуля, то операции семафора автоматически блокируются.

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

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