В чем разница между семафорами и мьютексом, предоставляемыми библиотекой pthread?pthreads mutex vs semaphore
ответ
Семафоры имеют синхронизированный счетчик, а мьютекс - только двоичный (true/false).
Семафор часто используется как окончательный механизм для ответа на то, сколько элементов ресурса используется - например, объект, представляющий n рабочих потоков, может использовать семафор для подсчета количества рабочих потоков.
Истина заключается в том, что вы можете представлять семафор INT, который синхронизируется мьютексом.
Установка счетчика на 1 (любое значение, которое представляет), семафор становится мьютеком – stacker
Означает ли это, что мьютексы и двоичные семафоры являются одними и теми же – cppdev
Нет, см. Http://www.opengroup.org/onlinepubs/009695399/functions/ sem_wait.html и http://www.opengroup.org/onlinepubs/009695399/functions/pthread_mutex_lock.html. –
mutex используется для предотвращения состояния гонки между несколькими потоками.
тогда как семафор используется как элемент синхронизации, используемый в нескольких процессах.
mutex не может быть заменен двоичным семафором, так как один процесс ожидает семафора, в то время как другой процесс освобождает семафор. В случае, если mutex и получение и выпуск обрабатываются одним и тем же.
(-1) Неправильное обобщение: для одного, мьютексы могут быть разделены между процессами - например: http://msdn.microsoft.com/en-us/library/ms682411(VS.85).aspx. Если ваша система не имеет имени mutex, просто сопоставьте некоторую общую память и создайте свой собственный. –
Неплохо, чтобы отметить это как «не полезно». Я много работал над M $. Легко сказать кому-то использовать общую память. на M $ все объекты ядра называются и совместно используются. Mutex - это объект ядра. Мьютекс pthread представляет собой CRITICAL_SECTION в M $. Невозможно поделиться CRITICAL_SECTION между процессами! – hackworks
@hackworks - pthread_mutex может быть инициализирован флагом «_POSIX_THREAD_PROCESS_SHARED», который позволяет ему работать в среде межпроцессного взаимодействия: http://linux.die.net/man/3/pthread_mutexattr_init – killdaclick
Мьютексы могут применяться только к потокам в одном процессе и не работают между процессами, как семафоры.
Эти две статьи объясняют большие детали о mutex против semaphores Также this переполнение стека ответ говорит аналогичный ответ.
Я собираюсь поговорить о Mutex vs Binary-Semaphore. Вы, очевидно, используете мьютекс, чтобы предотвратить одновременный доступ к данным в одном потоке другим потоком.
(Предположим, что вы только что назвали lock() и в процессе доступа к данным. Это означает, что вы не ожидаете, что какой-либо другой поток (или другой экземпляр того же кода потока) будет обращаться к тому же данные, заблокированные одним и тем же мьютексом. То есть, если это один и тот же код потока, выполняемый на другом экземпляре потока, он блокирует блокировку, тогда блокировка() должна блокировать поток управления.)
Это относится к который использует другой поток-код, который также обращается к тем же данным и который также заблокирован одним и тем же мьютексом.
В этом случае вы все еще находитесь в процессе доступа к данным, и вы можете взять, скажем, еще 15 секунд, чтобы достичь разблокировки мьютекса (так что другой поток, который блокируется в блокировке мьютекса, будет разблокирован и будет разрешить элементу управления доступ к данным).
Вы когда-нибудь позволяли другому потоку просто разблокировать один и тот же мьютекс и, в свою очередь, разрешить поток, который уже ждет (блокирование) в блокировке мьютекса, чтобы разблокировать и получить доступ к данным? (Надеюсь, что вы получили то, что я говорю здесь.)
В соответствии с согласованным универсального определения,
- с «мьютекс» это не может произойти. Ни одна другая нить не может разблокировать замок в вашей теме
- с «двоичным семафором» это может случиться.Любой другой поток может разблокировать замок в вашей теме
Так что, если вы очень частности, об использовании двоичного семафора вместо взаимной блокировки, то вы должны быть очень осторожны в «обзорного» замки и разблокирует, я имею в виду , что каждый поток управления, который попадает в каждую блокировку, должен ударить по разблокированному вызову, а также не должно быть никакой «первой разблокировки», а должно быть всегда «первой блокировкой».
Мне нравится ** область **. Он относится к части реализации, которая отличается двоичным семафором и мьютексом. – shuva
Семафор больше используется в качестве флага, для которого на самом деле не нужно приносить RTOS/ОС. Семафор может быть случайно или намеренно изменен другими потоками (скажем, из-за плохого кодирования). Когда вы используете использование мьютекса, он владеет ресурсами. Ни одна другая нить не может получить к ней доступ, прежде чем ресурс освободится.
Я проголосую за флаговую часть. – shuva
Разница между 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
, где внешний алгоритм может изменить состояние и в конечном итоге алгоритм/стратегию, выбранную для запуска.
The Toilet Пример
мьютекс:
Является ключом к туалету. Один человек может иметь ключ - занимать туалет - в то время. По завершении, человек дает (освобождает) ключ к следующему человеку в очереди.
«Мьютексы обычно используются для сериализации доступа к разделу кода повторного входа, который не может выполняться одновременно более чем одним потоком. Объект mutex разрешает только один поток в контролируемый раздел, заставляя другие потоки пытаться получить доступ к этому разделу, чтобы дождаться выхода первого потока из этого раздела ».
(Мьютекс действительно семафор со значением 1)
Семафор:
Является ли количество свободных одинаковых ключей туалет. Например, у нас есть четыре туалета с одинаковыми замками и ключами. Счет семафора - количество ключей - устанавливается в начале 4 (все четыре туалета являются свободными), тогда значение счета уменьшается по мере поступления людей. Если все туалеты заполнены, то есть. свободных ключей нет, счет семафора равен 0. Теперь, когда уравнение один человек выходит из туалета, семафор увеличивается до 1 (один свободный ключ) и передается следующему человеку в очереди.
«Семафор ограничивает количество одновременных пользователей общего ресурса до максимального числа. Темы могут запрашивать доступ к ресурсу (уменьшая семафор) и могут сигнализировать, что они закончили использование ресурса (приращение семафора) «.
семафоры не предусмотрены Pthreads, и могут быть использованы в не нарезке программ. – ephemient
любая конструкция синхронизации может использоваться в не-потоковом коде: P –
Ну, разница, которую я хотел выделить, заключается в том, что семафоры использовались до pthreads. Вы можете разместить 'sem_t' в общей памяти и использовать его для синхронизации операций между процессами. С другой стороны, даже если вы не создаете несколько потоков, вы должны скомпилировать и связать с '-pthread', чтобы использовать' pthread_mutex_ * '. (Некоторые платформы не применяют это, но это стандарт.) – ephemient