Производитель -модель - двоичный семафор или мутекс?

StackOverflow https://stackoverflow.com/questions/3993790

Вопрос

Это в основном о понимании концепции, которая меня смущает.

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

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

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

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

Это было полезно?

Решение

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

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

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top