Модель производитель-потребитель - бинарный семафор или мьютекс?

В основном это касается понимания концепции, что меня смущает.

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

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

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

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


person daydreamer    schedule 22.10.2010    source источник


Ответы (1)


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

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

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

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

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

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

person svenningsson    schedule 23.10.2010