Я постараюсь как можно лучше разобраться в путанице. Я объясню понятия так, как они традиционно определяются. Проблема в том, что люди начинают смешивать значения многих из этих понятий, и из-за этого возникает много путаницы.
Всякий раз, когда у нас есть фрагмент кода, который изменяет часть памяти (скажем, переменную), которая совместно используется различными процессами или потоками, у нас есть критическая секция. Если мы не позаботимся о правильной синхронизации этого фрагмента кода, мы получим ошибки. Одним из примеров критической секции является добавление производителем элемента в некий общий контейнер.
Одним из способов синхронизации критических разделов является принудительное взаимное исключение. Взаимное исключение означает, что только один процесс или поток одновременно может выполнять критическую секцию и получать доступ к общей части памяти. Обратите внимание, что взаимное исключение не является механизмом само по себе, это принцип, который мы можем применять различными способами. Некоторые говорят о блокировках и бинарных семафорах как о мьютексах, но это смешивает понятия таким образом, что это может привести к путанице.
Двоичный семафор — это способ принудительного взаимного исключения. Всякий раз, когда процесс хочет получить доступ к мьютексу, он может получить семафор. Эта операция будет заблокирована, если в этот момент семафор удерживается другим процессом. Отсюда и взаимное исключение. Как только процесс завершается с мьютексом, мы освобождаем семафор, позволяя другим процессам войти в мьютекс. Таким образом, мы можем добиться взаимного исключения с помощью бинарного семафора, но это ни в коем случае не единственное возможное применение бинарного семафора.
Семафоры хороши для решения проблем производитель-потребитель, потому что они могут принимать произвольное натуральное число, а не только 0 и 1 в случае двоичных семафоров. Это очень полезно при синхронизации проблем производитель-потребитель, потому что вы можете позволить значению семафора содержать количество доступных элементов. Если количество элементов уменьшится до нуля, операции семафора будут автоматически заблокированы.
Я понимаю, что объяснение проблемы производителя-потребителя немного краткое, и я рекомендую вам взглянуть на решения, использующие семафоры, а также сравнить эти решения с другими решениями, использующими другие конструкции синхронизации, такие как мониторы или передача сообщений. Я нашел, что это очень освещает.
person
svenningsson
schedule
23.10.2010