Putereads mutex vs семафор

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

Ответ 1

семафоры имеют синхронизированный счетчик, а мьютекс - только двоичный (true/false).

Семафор часто используется как окончательный механизм для ответа на то, сколько элементов ресурса используется - например, объект, который представляет n рабочих потоков, может использовать семафор для подсчета количества рабочих потоков.

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

Ответ 2

Я собираюсь поговорить о Mutex vs Binary-Semaphore. Вы, очевидно, используете мьютекс, чтобы предотвратить одновременный доступ к данным в одном потоке другим потоком.

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

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

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

Вы когда-нибудь позволяли другому потоку просто разблокировать один и тот же мьютекс и, в свою очередь, разрешить поток, который уже ожидает (блокирование) блокировки мьютекса, чтобы разблокировать и получить доступ к данным? (Надеюсь, вы получили то, что я говорю здесь.)

Согласно согласованному универсальному определению

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

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

Ответ 3

mutex используется, чтобы избежать состояния гонки между несколькими потоками.

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

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

Ответ 4

В этих двух статьях объясняются большие подробности о mutex vs semaphores Также этот ответ на переполнение стека говорит аналогичный ответ.

Ответ 5

Разница между semaphore и mutex заключается в различии между механизмом и шаблоном. Разница в их назначении (намерение) и как они работают ( поведенческий).

mutex, barrier, pipeline - это шаблоны параллельного программирования. mutex используется (предназначено) для защиты critical section и обеспечения mutual exclusion. barrier заставляет агентов (поток/процесс) продолжать ждать друг друга.

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

Есть случаи, когда mutex позволяет единовременному агенту. Бывают случаи, когда он позволяет нескольким агентам (несколько читателей) и запрещать некоторые другие агенты (писатели).

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

В популярной культуре semaphores являются механизмами, предоставляемыми ядрами, а mutexes предоставляются библиотекой пользовательского пространства.

Обратите внимание, что существуют неправильные представления о semaphores и mutexes. В нем сказано, что semaphores используются для synchronization. А mutexes имеет ownership. Это связано с популярными книгами ОС. Но истина - это все мьютексы, семафоры и барьеры, используемые для синхронизации. Цель мьютекса не ownership, а mutual exclusion. Это заблуждение привело к возникновению популярного интервью с вопросом о различии mutexes и binary-semaphores.

Резюме

намерение
  • мьютекс, взаимное исключение
  • семафор, реализовать параллельные шаблоны проектирования
поведение
  • mutex, только разрешенный агент входит в критический раздел и только он (они) может выйти
  • семафор, введите, если флаг говорит "идти", иначе дождитесь, пока кто-то изменит флаг

В проектной перспективе mutex больше похожа на state-pattern, где алгоритм, выбранный государством, может изменить состояние. binary-semaphore больше похож на strategy-pattern, где внешний алгоритм может изменить состояние и, в конечном итоге, алгоритм/стратегию, выбранную для запуска.

Ответ 6

Семафор больше используется в качестве флага, для которого вам действительно не нужно приносить RTOS/ОС. Семафор может быть случайно или намеренно изменен другими потоками (скажем, из-за плохого кодирования). Когда вы используете поток mutex, он владеет ресурсами. Ни одна другая нить не сможет получить доступ к ней, прежде чем ресурс станет бесплатным.

Ответ 7

Пример туалета

мьютекса:

Является ключом к туалету. Один человек может иметь ключ - занимать туалет - в то время. По завершении, человек дает (освобождает) ключ к следующему человеку в очереди.

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

(Мьютекс - действительно семафор со значением 1.)

Семафор:

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

"Семафор ограничивает количество одновременных пользователей общего ресурса до максимального числа. Темы могут запрашивать доступ к ресурсу (уменьшая семафор) и могут сигнализировать, что они закончили использовать ресурс (увеличивая семафор)."

Источник

Ответ 8

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