Что такое мьютекс? - PullRequest
       35

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

552 голосов
/ 29 августа 2008

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

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

Ответы [ 9 ]

1903 голосов
/ 29 августа 2008

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

Замените Цыпленка на Мьютекс, а человека - на нить, и у вас в основном есть концепция мьютекса.

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

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

110 голосов
/ 29 августа 2008

Mutex - взаимоисключающий флаг. Он действует как привратник к разделу кода, позволяя одному потоку входить и блокируя доступ ко всем остальным. Это гарантирует, что контролируемый код будет обрабатываться только одним потоком за раз. Просто не забудьте освободить мьютекс, когда закончите. :)

65 голосов
/ 29 августа 2008

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

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

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

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

44 голосов
/ 29 августа 2008

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

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

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

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

Теперь спросите у Google, как их использовать! :)

26 голосов
/ 29 августа 2008

В C # общим используемым мьютексом является Monitor . Тип: ' System.Threading.Monitor '. Он также может использоваться неявно через оператор lock (Object) . Одним из примеров его использования является создание класса 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;
    }
}

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

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

15 голосов
/ 27 июня 2014

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

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

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

14 голосов
/ 09 октября 2017

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

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

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

13 голосов
/ 03 июля 2018

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

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

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

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

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

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

Замените Цыпленка на Мьютекс, а человека - на нить, и у вас в основном есть концепция мьютекса.

@ Xetius

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

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

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

MSDN Reference Mutex

11 голосов
/ 02 сентября 2008

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...