Что такое мьютекс?

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

Что такое мьютекс и как вы его используете?

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

Замените цыпленка с помощью Mutex и человека с помощью нитки, и вы в основном имеете концепцию мьютекса.

Конечно, нет такой вещи, как резиновый мьютекс. Только резиновая курица. У моих кошек когда-то была резиновая мышь, но они ее съели.

Конечно, прежде чем использовать резиновый цыпленок, вам нужно спросить себя, действительно ли вам нужно 5 человек в одной комнате, и не просто будет проще, если один человек в комнате сам сделает всю работу. На самом деле, это просто расширяет аналогию, но вы получаете эту идею.

Мьютекс – это взаимоисключающий флаг. Он действует как хранитель ворот в раздел кода, разрешающий один stream и блокирующий доступ ко всем остальным. Это гарантирует, что управляемый код будет поражен только одним streamом за раз. Просто обязательно отпустите мьютекс, когда закончите. 🙂

Взаимное исключение. Вот запись в Википедии:

http://en.wikipedia.org/wiki/Mutual_exclusion

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

Конкретные детали того, как это достигается, очевидно, сильно различаются по языку программирования.

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

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

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

Некоторым языкам не нужна эта конструкция из-за парадигмы, например, функционального программирования (Haskell, ML – хорошие примеры).

Теперь попробуйте Google, как их использовать! 🙂

В C # общий мьютекс используется Монитором . Тип – « System.Threading.Monitor ». Он также может использоваться неявно через оператор « lock (Object) ». Одним из примеров его использования является построение classа Singleton.

private static readonly Object instanceLock = new Object(); private static MySingleton instance; public static MySingleton Instance { lock(instanceLock) { if(instance == null) { instance = new MySingleton(); } return instance; } } 

Оператор блокировки с использованием частного объекта блокировки создает критический раздел. Требование, чтобы каждый stream ожидал завершения предыдущего. Первый stream войдет в раздел и инициализирует экземпляр. Второй stream будет ждать, попасть в раздел и получить инициализированный экземпляр.

Любая синхронизация статического члена может также использовать оператор блокировки.

Чтобы сначала понять MUTEX, вам нужно знать, что такое «состояние гонки», и только тогда вы поймете, зачем нужен MUTEX. Предположим, у вас есть многопоточная программа, и у вас есть два streamа. Теперь у вас есть одно задание в очереди заданий. Первый stream проверяет очередь заданий и после того, как он найдет задание, он начнет его выполнять. Второй stream также проверяет очередь заданий и обнаруживает, что в очереди есть одно задание. Таким образом, он также назначит один и тот же указатель на работу. Итак, теперь, что происходит, оба streamа выполняют одну и ту же работу. Это вызовет ошибку сегментации. Это пример состояния гонки.

Решение этой проблемы – MUTEX. MUTEX – это своего рода замок, который блокирует один stream за раз. Если другой stream хочет заблокировать его, stream просто блокируется.

Тема MUTEX в этой ссылке в pdf-файле действительно стоит прочитать.

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

Здесь есть несколько отличных ответов, вот еще одна большая аналогия для объяснения того, что такое мьютекс :

Рассмотрим один туалет с ключом . Когда кто-то входит, они берут ключ, а туалет занят . Если кому-то еще нужно пользоваться туалетом, им нужно ждать в очереди . Когда человек в туалете закончен , они передают ключ следующему человеку в очереди. Имеют смысл, не так ли?

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

Что такое Mutex ?

Мьютекс (на самом деле термин «мьютекс» является коротким для взаимного исключения), также известный как спинлок – простейший инструмент синхронизации, который используется для защиты критических областей и, таким образом, предотвращает условия гонки. Это stream должен получить блокировку перед входом в критический раздел (в критическом разделе многоstreamовые streamи разделяют общую переменную, обновляют таблицу, записывают файл и т. Д.), Она освобождает блокировку, когда она выходит из критической секции.

Что такое состояние гонки ?

Условие гонки возникает, когда два или более streamа могут обращаться к общим данным, и они пытаются изменить его в одно и то же время. Поскольку алгоритм планирования streamов может меняться между streamами в любое время, вы не знаете порядок, в котором streamи будут пытаться получить доступ к общим данным. Следовательно, результат изменения данных зависит от алгоритма планирования streamов, то есть оба streamа являются «гоночными» для доступа / изменения данных.

Пример реальной жизни:

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

Замените цыпленка с помощью Mutex и человека с помощью нитки, и вы в основном имеете концепцию мьютекса.

@Xetius

Использование в C #:

В этом примере показано, как локальный объект Mutex используется для синхронизации доступа к защищенному ресурсу. Поскольку каждый вызывающий stream блокируется до тех пор, пока он не приобретет права собственности на мьютекс, он должен вызвать метод ReleaseMutex, чтобы освободить право собственности на stream.

 using System; using System.Threading; class Example { // Create a new Mutex. The creating thread does not own the mutex. private static Mutex mut = new Mutex(); private const int numIterations = 1; private const int numThreads = 3; static void Main() { // Create the threads that will use the protected resource. for(int i = 0; i < numThreads; i++) { Thread newThread = new Thread(new ThreadStart(ThreadProc)); newThread.Name = String.Format("Thread{0}", i + 1); newThread.Start(); } // The main thread exits, but the application continues to // run until all foreground threads have exited. } private static void ThreadProc() { for(int i = 0; i < numIterations; i++) { UseResource(); } } // This method represents a resource that must be synchronized // so that only one thread at a time can enter. private static void UseResource() { // Wait until it is safe to enter. Console.WriteLine("{0} is requesting the mutex", Thread.CurrentThread.Name); mut.WaitOne(); Console.WriteLine("{0} has entered the protected area", Thread.CurrentThread.Name); // Place code to access non-reentrant resources here. // Simulate some work. Thread.Sleep(500); Console.WriteLine("{0} is leaving the protected area", Thread.CurrentThread.Name); // Release the Mutex. mut.ReleaseMutex(); Console.WriteLine("{0} has released the mutex", Thread.CurrentThread.Name); } } // The example displays output like the following: // Thread1 is requesting the mutex // Thread2 is requesting the mutex // Thread1 has entered the protected area // Thread3 is requesting the mutex // Thread1 is leaving the protected area // Thread1 has released the mutex // Thread3 has entered the protected area // Thread3 is leaving the protected area // Thread3 has released the mutex // Thread2 has entered the protected area // Thread2 is leaving the protected area // Thread2 has released the mutex 

Ссылка Mutex MSDN

  • Зачем использовать ReentrantLock, если вы можете использовать синхронизированный (это)?
  • Недопустимая проблема с доступом к нескольким streamам
  • Является ли изменчивая переменная «читается» так же быстро, как обычно?
  • Предотrotation блокировки графического интерфейса Swing во время фоновой задачи
  • Как сделать .NET COM-объект квартирной резьбой?
  • Как обновить ObservableCollection с помощью рабочего streamа?
  • Почему нерестовые streamи в контейнере Java EE обескуражены?
  • Как получить использование процессора в streamе в windows (win32)
  • Как отдать приоритет привилегированной теме при блокировке мьютекса?
  • Использует ли использование библиотеки Tasks (TPL) multithreading приложения?
  • Что будет использоваться для обмена данными между streamами, выполняются на одном ядре с HT?
  • Давайте будем гением компьютера.