pthreads мьютекс против семафора

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

65 голосов | спросил cppdev 14 Jpm1000000pmThu, 14 Jan 2010 19:36:54 +030010 2010, 19:36:54

8 ответов


0

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

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

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

ответил Hassan Syed 14 Jpm1000000pmThu, 14 Jan 2010 19:38:15 +030010 2010, 19:38:15
0

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

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

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

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

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

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

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

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

ответил Paxi 11 TueEurope/Moscow2012-12-11T21:30:32+04:00Europe/Moscow12bEurope/MoscowTue, 11 Dec 2012 21:30:32 +0400 2012, 21:30:32
0

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

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

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

ответил C Learner 15 Jam1000000amFri, 15 Jan 2010 11:49:53 +030010 2010, 11:49:53
0

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

ответил tsenapathy 4 72012vEurope/Moscow11bEurope/MoscowSun, 04 Nov 2012 23:44:29 +0400 2012, 23:44:29
0

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

ответил shuva 17 Maypm16 2016, 20:30:30
0

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

мьютекса:

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

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

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

Семафор:

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

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

Источник

ответил Ankur 10 J000000Sunday16 2016, 22:33:49
0

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

ответил ajinkya 1 stEurope/Moscowp30Europe/Moscow09bEurope/MoscowTue, 01 Sep 2015 05:17:38 +0300 2015, 05:17:38
0

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

ответил batteringRam 8 Mayam11 2011, 04:31:57

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132