2010-01-14 3 views
62

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

+11

семафоры не предусмотрены Pthreads, и могут быть использованы в не нарезке программ. – ephemient

+5

любая конструкция синхронизации может использоваться в не-потоковом коде: P –

+4

Ну, разница, которую я хотел выделить, заключается в том, что семафоры использовались до pthreads. Вы можете разместить 'sem_t' в общей памяти и использовать его для синхронизации операций между процессами. С другой стороны, даже если вы не создаете несколько потоков, вы должны скомпилировать и связать с '-pthread', чтобы использовать' pthread_mutex_ * '. (Некоторые платформы не применяют это, но это стандарт.) – ephemient

ответ

66

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

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

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

+3

Установка счетчика на 1 (любое значение, которое представляет), семафор становится мьютеком – stacker

+1

Означает ли это, что мьютексы и двоичные семафоры являются одними и теми же – cppdev

+5

Нет, см. Http://www.opengroup.org/onlinepubs/009695399/functions/ sem_wait.html и http://www.opengroup.org/onlinepubs/009695399/functions/pthread_mutex_lock.html. –

7

mutex используется для предотвращения состояния гонки между несколькими потоками.

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

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

+1

(-1) Неправильное обобщение: для одного, мьютексы могут быть разделены между процессами - например: http://msdn.microsoft.com/en-us/library/ms682411(VS.85).aspx. Если ваша система не имеет имени mutex, просто сопоставьте некоторую общую память и создайте свой собственный. –

+1

Неплохо, чтобы отметить это как «не полезно». Я много работал над M $. Легко сказать кому-то использовать общую память. на M $ все объекты ядра называются и совместно используются. Mutex - это объект ядра. Мьютекс pthread представляет собой CRITICAL_SECTION в M $. Невозможно поделиться CRITICAL_SECTION между процессами! – hackworks

+0

@hackworks - pthread_mutex может быть инициализирован флагом «_POSIX_THREAD_PROCESS_SHARED», который позволяет ему работать в среде межпроцессного взаимодействия: http://linux.die.net/man/3/pthread_mutexattr_init – killdaclick

0

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

2

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

16

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

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

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

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

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

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

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

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

+0

Мне нравится ** область **. Он относится к части реализации, которая отличается двоичным семафором и мьютексом. – shuva

1

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

+0

Я проголосую за флаговую часть. – shuva

2

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

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

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

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

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

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

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

Резюме,

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

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

1

The Toilet Пример

мьютекс:

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

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

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

Семафор:

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

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

Source

Смежные вопросы