multithreading - пример - Что такое мьютекс?




std mutex lock_guard (6)

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

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


В 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;
    }
}

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

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


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

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

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

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


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

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

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

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

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


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

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

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

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


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


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

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

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





mutex