Мьютекс - это концепция программирования, которая часто используется для решения многопоточных задач. Мой вопрос к сообществу:
Что такое мьютекс и как вы его используете?
multithreading
concurrency
mutex
bmurphy1976
источник
источник
Ответы:
Когда на работе я веду бурную дискуссию, я использую резинового цыпленка, которого держу в своем столе именно для таких случаев. Человек, держащий курицу, является единственным человеком, которому разрешено говорить. Если вы не держите курицу, вы не можете говорить. Вы можете только указать, что хотите курицу, и подождать, пока вы ее получите, прежде чем говорить. Как только вы закончите говорить, вы можете вернуть курицу модератору, который передаст ее следующему человеку, который будет говорить. Это гарантирует, что люди не разговаривают друг с другом, а также имеют свое собственное пространство для общения.
Замените Цыпленка на Мьютекс, а человека - на нить, и у вас в основном будет концепция мьютекса.
Конечно, не существует такого понятия, как резиновый мьютекс. Только резиновая курица. У моих кошек когда-то была резиновая мышь, но они ее съели.
Конечно, прежде чем использовать резиновую курицу, вам нужно спросить себя, нужно ли вам на самом деле 5 человек в одной комнате, и не будет ли проще, когда один человек в комнате сам выполняет всю работу. На самом деле, это просто продолжение аналогии, но вы поняли идею.
источник
Мьютекс - это взаимоисключающий флаг. Он действует как привратник к разделу кода, позволяя одному потоку входить и блокируя доступ ко всем остальным. Это гарантирует, что контролируемый код будет обрабатываться только одним потоком за раз. Просто не забудьте освободить мьютекс, когда закончите. :)
источник
Взаимное исключение. Вот запись в Википедии:
http://en.wikipedia.org/wiki/Mutual_exclusion
Задача мьютекса - синхронизировать два потока. Когда два потока пытаются получить доступ к одному ресурсу, общая схема состоит в том, чтобы первый блок кода пытался получить доступ для установки мьютекса перед вводом кода. Когда второй блок кода пытается получить доступ, он видит, что мьютекс установлен, и ждет, пока первый блок кода не завершится (и отменяет установку мьютекса), а затем продолжает.
Конкретные детали того, как это достигается, очевидно, сильно зависит от языка программирования.
источник
Когда у вас многопоточное приложение, разные потоки иногда совместно используют общий ресурс, такой как переменная или аналогичный. К этому общему источнику часто нельзя получить доступ одновременно, поэтому необходима конструкция, чтобы гарантировать, что только один поток использует этот ресурс одновременно.
Эта концепция называется «взаимное исключение» (сокращение Mutex) и позволяет гарантировать, что в этой области разрешен только один поток с использованием этого ресурса и т. Д.
Как их использовать, зависит от языка, но часто (если не всегда) основывается на мьютексе операционной системы.
Некоторые языки не нуждаются в этой конструкции из-за парадигмы, например, функционального программирования (хорошие примеры - Haskell, ML).
источник
В C # распространенным мьютексом является Monitor . Тип « System.Threading.Monitor ». Это также может быть использовано неявно через оператор ' lock (Object) '. Одним из примеров его использования является создание класса Singleton.
Оператор lock, использующий объект private lock, создает критический раздел. Требование к каждому потоку дождаться окончания предыдущего. Первый поток войдет в раздел и инициализирует экземпляр. Второй поток будет ждать, попасть в раздел и получить инициализированный экземпляр.
Любой вид синхронизации статического члена может использовать оператор блокировки аналогично.
источник
Что такое мьютекс ?
Мьютекс (фактически термин мьютекс - это сокращение от взаимного исключения), также известный как спин-блокировка, является самым простым инструментом синхронизации, который используется для защиты критических областей и, таким образом, предотвращения условий гонки. То есть поток должен получить блокировку перед входом в критический раздел (в критическом разделе несколько потоков совместно используют общую переменную, обновление таблицы, запись файла и т. Д.), Он снимает блокировку, когда покидает критический раздел.
Что такое состояние гонки ?
Состояние гонки возникает, когда два или более потоков могут получить доступ к общим данным, и они пытаются изменить их одновременно. Поскольку алгоритм планирования потоков может переключаться между потоками в любое время, вы не знаете порядок, в котором потоки будут пытаться получить доступ к общим данным. Следовательно, результат изменения данных зависит от алгоритма планирования потоков, то есть оба потока «участвуют в гонке», чтобы получить доступ / изменить данные.
Пример из реальной жизни:
Использование в C #:
В этом примере показано, как локальный объект Mutex используется для синхронизации доступа к защищенному ресурсу. Поскольку каждый вызывающий поток блокируется до тех пор, пока не получит право собственности на мьютекс, он должен вызвать метод ReleaseMutex, чтобы освободить право собственности на поток.
MSDN Reference Mutex
источник
Здесь есть несколько отличных ответов, вот еще одна замечательная аналогия для объяснения того, что такое мьютекс :
Рассмотрим один туалет с ключом . Когда кто-то входит, они берут ключ и туалет занят . Если кому-то еще нужно пользоваться туалетом, ему нужно ждать в очереди . Когда человек в туалете сделан , он передает ключ следующему человеку в очереди. Имеет смысл, верно?
Преобразуйте туалет в истории в общий ресурс и ключ к мьютексу . Взяв ключ от туалета (приобретите замок), вы сможете его использовать. Если ключа нет (замок заблокирован), вам придется подождать. Когда ключ возвращается человеком ( снимите блокировку ), вы можете получить его сейчас.
источник
Чтобы понять MUTEX, сначала вам нужно знать, что такое «состояние гонки», и только тогда вы поймете, зачем нужен MUTEX. Предположим, у вас есть многопоточная программа и два потока. Теперь у вас есть одна работа в очереди. Первый поток проверит очередь заданий и, найдя задание, начнет ее выполнять. Второй поток также проверит очередь заданий и обнаружит, что в очереди есть одно задание. Таким образом, он также назначит тот же указатель задания. Итак, что теперь происходит, оба потока выполняют одну и ту же работу. Это приведет к ошибке сегментации. Это пример состояния гонки.
Решением этой проблемы является MUTEX. MUTEX - это своего рода блокировка, которая блокирует один поток за раз. Если другой поток хочет заблокировать его, он просто блокируется.
Тема MUTEX в этой ссылке на файл PDF действительно стоит прочитать.
источник
Мьютексы полезны в ситуациях, когда вам необходимо обеспечить исключительный доступ к ресурсу для нескольких процессов, когда обычная блокировка не поможет, поскольку она работает только для потоков.
источник
Mutex: Mutex означает Mut ual Ex clusion. Это означает, что одновременно один процесс / поток может войти в критическую секцию. В параллельном программировании, когда несколько потоков / процессов пытаются обновить общий ресурс (любая переменная, общая память и т. Д.), Может привести к неожиданному результату. (Как результат зависит от того, какой поток / процесс получает первый доступ).
Чтобы избежать такого неожиданного результата, нам нужен механизм синхронизации, который гарантирует, что только один поток / процесс получает доступ к такому ресурсу одновременно.
Библиотека pthread обеспечивает поддержку Mutex.
Это структура для типа данных мьютекса, т.е. pthread_mutex_t. Когда мьютекс заблокирован, __lock установлен на 1. Когда он разблокирован, __lock установлен на 0.
Это гарантирует, что никакие два процесса / потока не могут получить доступ к критическому разделу одновременно.
источник