Мьютекс против Событий
В C # есть много разных вариантов синхронизации потоков. Два более широко используемых - мьютекс и событие. В чем именно разница между этими двумя? Какой вариант лучше?
Опция события может дать потокам возможность блокироваться до тех пор, пока событие не будет передано, таким образом, имя «событие». Это то же самое, что усыплять что-либо и просыпаться только тогда, когда происходит что-то важное. События отличаются от мьютексов, потому что мьютексы не имеют опцию или функцию сигнализации. События могут очистить сигнал, как только кто-то, кто смог его дождаться, проснется. Даже API-интерфейсы могут блокировать опцию до тех пор, пока не будут сигнализированы одно или все различные события. Кроме того, события являются объектами ядра. Они не «легче» по сравнению с мьютексами. Событие - это в основном объект ядра, имеющий два состояния. Обычно событие сигнализирует о наступлении события, а иногда даже об окончании операции ввода-вывода.
«Мьютекс» означает «взаимное исключение». Это форма ограниченного координационного механизма для ресурсов, которые являются общими. Думайте об этом как о форме сделки. Вы не обязаны ждать, хотя вы хотите получить доступ к нескольким общим ресурсам (только в том случае, если другие уже получают к нему доступ), которые вы блокируете. Мьютекс состоит из двух состояний, хотя существует для взаимного исключения. Это для случаев, когда вы хотите защитить фрагмент кода, который обычно обновляет общий ресурс из той части, в которой мьютекс заявлен для той части, в которой он будет освобожден. Это приводит к тому, что никакой другой поток не может проходить через раздел.
Люди, которые пытались смоделировать событие с помощью мьютекса, сталкивались с проблемой, заключающейся в том, что, как только блокировка получена или сигнализировано событие, человек не пускает всех остальных до тех пор, пока блокировка не будет снята. Это не семантика события, которое сигнализируется. Событие может остаться опубликованным, и форма шлюза будет доступна для всех тестов потока в случае отсутствия каких-либо блокировок. Mutex, предназначенный для межпроцессной синхронизации, находится в объекте режима ядра. События, сделанные для многопоточной синхронизации одним методом, находятся в объекте пользовательского режима..
Объект мьютекса слишком тяжелый и слишком общий. Объекты событий намного легче. Синхронизация в пользовательском режиме используется в большинстве ситуаций по той причине, что она дает меньше циклов ЦП. Mutex очень похож на критическую секцию и используется для синхронизации доступа к общим ресурсам. События имеют совершенно другую функцию, потому что они используются для синхронизации задач или для управления расписанием задач для некоторых людей.
События - это скорее условная переменная, в отличие от Mutex, которая больше похожа на
монитор в некоторой терминологии, или это может быть традиционная форма семафора / мьютекса.
Резюме:
1. Опция события может дать потокам возможность блокироваться, пока событие не будет передано, таким образом, название «событие».
2. Событие - это объект ядра, имеющий два состояния. Обычно событие сигнализирует о наступлении события, а иногда даже об окончании операции ввода-вывода.
3. «Мьютекс» означает «взаимное исключение». Это форма ограниченного координационного механизма для ресурсов, которые являются общими.
4.Mutex, предназначенный для межпроцессной синхронизации, находится в объекте режима ядра. События, сделанные для многопоточной синхронизации одним методом, находятся в объекте пользовательского режима..
5.События - это скорее условная переменная, в отличие от мьютекса, который больше похож на
монитор в некоторой терминологии, или это может быть традиционная форма семафора / мьютекса.