Разница между двоичным семафором и мьютексом - PullRequest
744 голосов
/ 15 сентября 2008

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

Ответы [ 30 ]

10 голосов
/ 15 октября 2008

В Windows есть два различия между мьютексами и двоичными семафорами:

  1. Мьютекс может быть освобожден только тем потоком, который владеет, то есть потоком, который ранее вызывал функцию Wait (или который стал владельцем при создании). Семафор может быть освобожден любым потоком.

  2. Поток может повторно вызывать функцию ожидания на мьютексе без блокировки. Однако, если вы дважды вызываете функцию ожидания для двоичного семафора без освобождения промежуточного семафора, поток блокируется.

10 голосов
/ 11 декабря 2012

Вы, очевидно, используете мьютекс для блокировки данных в одном потоке, к которым одновременно обращается другой поток. Предположим, что вы только что позвонили lock() и в процессе доступа к данным. Это означает, что вы не ожидаете, что какой-либо другой поток (или другой экземпляр того же кода потока) получит доступ к тем же данным, заблокированным тем же мьютексом. То есть, если один и тот же код потока исполняется в другом экземпляре потока, попадает в блокировку, тогда lock() должен блокировать поток управления там. Это относится к потоку, который использует другой код потока, который также обращается к тем же данным и который также заблокирован тем же мьютексом. В этом случае вы все еще находитесь в процессе доступа к данным, и вам может потребоваться, скажем, еще 15 секунд, чтобы достичь разблокировки мьютекса (чтобы другой поток, блокируемый в блокировке мьютекса, разблокировался и позволил элементу управления доступ к данным). Разрешаете ли вы любой ценой позволить еще одному потоку просто разблокировать тот же мьютекс и, в свою очередь, разрешить потоку, который уже ожидает (блокирует) блокировку мьютекса, разблокировать и получить доступ к данным? Надеюсь, вы поняли, что я здесь говорю? В соответствии с согласованным универсальным определением!

  • с «мьютексом» этого не может быть. Никакая другая нить не может разблокировать замок в вашей теме
  • с «двоичным семафором» это может произойти. Любая другая тема может разблокировать блокировка в вашей теме

Итак, если вы очень осторожны в использовании бинарного семафора вместо мьютекса, вам следует быть очень осторожным в «определении» блокировок и разблокировок. Я имею в виду, что каждый поток управления, который затрагивает каждую блокировку, должен вызывать вызов разблокировки, также не должно быть никакой «первой разблокировки», скорее это должна быть всегда «первая блокировка».

10 голосов
/ 17 мая 2013

Mutex используются для «Механизмов блокировки». один процесс за раз может использовать общий ресурс

тогда

Семафоры используются для «Сигнальных механизмов» как "Я сделал, теперь можно продолжить"

9 голосов
/ 30 мая 2014

Миф:

Пара статей говорит, что «двоичный семафор и мьютекс одинаковы» или «Семафор со значением 1 - мьютекс», но основное отличие в том, что Mutex может быть освобожден только тем потоком, который его получил, в то время как вы можете сигнализировать семафор из любого другого нить

Ключевые моменты:

• Поток может получить более одной блокировки (Mutex).

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

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

• Двоичный семафор и мьютекс похожи, но не одинаковы.

• Mutex является дорогостоящей операцией из-за протоколов защиты, связанных с ним.

• Основная цель мьютекса - добиться атомарного доступа или блокировки ресурса

8 голосов
/ 06 марта 2011

A Mutex контролирует доступ к одному общему ресурсу. Он предоставляет операции для acqu () доступа к этому ресурсу и release () его после завершения.

A Семафор контролирует доступ к общему пулу ресурсов. Он предоставляет операции для Wait () , пока один из ресурсов в пуле не станет доступным, и Signal () , когда он возвращается в пул.

Когда количество ресурсов, которые защищает семафор, больше 1, оно называется Подсчет семафора . Когда он управляет одним ресурсом, он называется Boolean Semaphore . Булев семафор эквивалентен мьютексу.

Таким образом, Семафор - это абстракция более высокого уровня, чем Mutex. Mutex может быть реализован с использованием семафора, но не наоборот.

6 голосов
/ 22 ноября 2008

Мьютекс работает над блокированием критической области, но семафор работает на счету.

6 голосов
/ 03 мая 2010

Измененный вопрос: в чем разница между мьютексом и "двоичным" семафором в "Linux"?

Ответ: Ниже приведены различия - i) Область действия - область действия мьютекса находится в адресном пространстве процесса, которое его создало, и используется для синхронизации потоков. Принимая во внимание, что семафор может использоваться в пространстве процессов и, следовательно, он может использоваться для межпроцессной синхронизации.

ii) Мьютекс легкий и быстрее семафора. Futex еще быстрее.

iii) Мьютекс может быть успешно получен одним и тем же потоком несколько раз при условии, что он должен освобождать его одинаковое количество раз. Другой поток, пытающийся получить, заблокирует. Принимая во внимание, что в случае семафора, если тот же процесс пытается получить его снова, он блокируется, поскольку его можно получить только один раз.

5 голосов
/ 30 марта 2015

Разница между двоичным семафором и мьютексом: ВЛАДЕНИЕ: Семафоры могут быть переданы (отправлены) даже от не текущего владельца. Это означает, что вы можете просто отправлять сообщения из любой другой темы, хотя вы не являетесь владельцем.

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

5 голосов
/ 26 ноября 2012

http://www.geeksforgeeks.org/archives/9102 обсуждается в деталях.

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

Это до программиста, если он / она хочет использовать двоичный семафор вместо мьютекса.

4 голосов
/ 19 августа 2010

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

...