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


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

8 65

8 ответов:

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

резюме

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

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

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

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

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

мьютекс:

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

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

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

семафор:

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

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

источник

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