Переменные блокировки против семафоров - PullRequest
0 голосов
/ 16 апреля 2019

Переменная блокировки и семафор кажутся идентичными.Объясните одно существенное различие между ними

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

Ответы [ 2 ]

1 голос
/ 17 апреля 2019

Вы подозреваете, что ваш учитель пытается вас обмануть?Если нет, то существует старая пословица: «Если вы все проверили и все еще не можете найти ответ, значит, вы знаете, что это не так».

Разница между механизмами синхронизации часто неуловима;и может показаться незначительным.Например, может показаться неважным, что семафор и переменная условия не имеют состояния - любой может их разбудить (post, release, signal, ...);в то время как мьютекс строго отслеживает состояние - его может разбудить только последний актер (процесс, поток, задача, ...), заявивший его (блокировка, ввод, ...).Если вам нужно ответить на вопрос «кому принадлежит этот ресурс», то для семафора или условной переменной нет ответа;но есть для мьютекса.

0 голосов
/ 17 апреля 2019

Я предполагаю lock variable как mutex.

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

Но они не совпадают по двум основным причинам.

  1. Намерение: Mutex должен использоваться с критической секциейкод.Они используются главным образом для того, чтобы убедиться, что ресурс используется одним потоком в программе.Если поток может заблокировать мьютекс, это означает, что он имеет эксклюзивный доступ к этому ресурсу.

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

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

  2. Использование: Mutex должен быть разблокирован потоком, который его заблокировал.В C, если поток пытается разблокировать мьютекс, который не заблокирован им, поведение не определено.В случае семафора, один поток может просто сделать semaphore_wait, а другой поток может semaphore_post (как обычно это используется).(«Одно существенное различие» ??: D)

Некоторые разработчики используют двоичные семафоры, которые используются в качестве мьютекса.Это рискованно из-за 2.Использование Я упоминал выше.Кроме того, по моему мнению, это похоже на обход мьютекса.Это почти как замена семафоров (не двоичных) мьютексом, счетчиком, флагом и механизмом опроса в случае sem_wait.Код будет работать с этим, но это излишнее.

На это есть больше ресурсов:

Разница между двоичным семафором и мьютексом

https://www.geeksforgeeks.org/mutex-vs-semaphore/

...