pthreads мьютекс против семафора - PullRequest
69 голосов
/ 14 января 2010

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

Ответы [ 8 ]

76 голосов
/ 14 января 2010
Семафоры

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

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

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

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

Я собираюсь поговорить о Mutex против бинарного семафора. Очевидно, что вы используете мьютекс для предотвращения одновременного доступа к данным в одном потоке другим потоком.

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

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

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

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

В соответствии с согласованным универсальным определением,

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

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

7 голосов
/ 15 января 2010

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

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

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

4 голосов
/ 10 июля 2016

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

Мьютекс:

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

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

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

Семафор:

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

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

Источник

3 голосов
/ 17 мая 2016

Разница между 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 больше похоже на state-pattern, где алгоритм, выбранный состоянием, может изменять состояние. binary-semaphore больше похоже на strategy-pattern, где внешний внешний алгоритм может изменить состояние и в конечном итоге выбран алгоритм / стратегия для запуска.

3 голосов
/ 04 ноября 2012

Эти две статьи объясняют большие детали о мьютекс против семафоры Также этот ответ переполнения стека говорит аналогичный ответ.

1 голос
/ 01 сентября 2015

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

0 голосов
/ 08 мая 2011

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

...