В чем разница между блокировкой и Mutex?

В чем разница между блокировкой и Mutex? Почему они не могут использоваться взаимозаменяемо?

Ответ 1

A lock специфичен для AppDomain, а Mutex в операционную систему, позволяющую выполнять блокировку и синхронизацию между процессами.

Ответ 2

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

Monitor (и ключевое слово lock), как сказал Дарин, ограничиваются AppDomain. Прежде всего потому, что для управления "блокировкой" и сохранения идентификатора Monitor

требуется ссылка на адрес памяти (в форме объекта-объекта)

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

Ответ 3

A Mutex может быть локальным для процесса или общесистемного. MSDN:

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

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

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

lock - это действительно ярлык для Monitor class, с другой стороны пытается избежать выделения ресурсов ядра и перехода к коду ядра (и, таким образом, более компактный и быстрый - если нужно найти конструкцию WinAPI, похожую на нее, это будет CriticalSection).

Другое отличие состоит в том, что другие указывают: с именем Mutex может использоваться через процессы.

Если у вас нет особых потребностей или требуется синхронизация между процессами, лучше придерживаться lock (aka Monitor) ˛

Существует несколько других "незначительных" различий, например, как обрабатывается отказ и т.д.

То же самое можно сказать о ReaderWriterLock и ReaderWriterLockSlim в 3.5, Semaphore и новом SemaphoreSlim в .NET 4.0 и т.д. Верно, что последние классы xxSlim нельзя использовать в качестве общесистемных примитивов синхронизации, но они никогда не предназначались - они были "только" , чтобы быть более быстрыми и более дружественными к ресурсам.

Ответ 4

Я использую Mutex для проверки, есть ли у меня уже копия приложения, работающего на том же компьютере.

bool firstInstance;
Mutex mutex = new Mutex(false, @"Local\DASHBOARD_MAIN_APPLICATION", out firstInstance);

if (!firstInstance)
{
    //another copy of this application running 
}
else
{
    //run main application loop here.
}
// Refer to the mutex down here so garbage collection doesn't chuck it out.
GC.KeepAlive(mutex);

Ответ 5

Mutex - это кросс-процесс, и будет классический пример не запускать более одного экземпляра приложения.

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

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

Ответ 6

Уже много сказано, но чтобы сделать его простым, здесь я беру.

блокировка → Простая в использовании оболочка на мониторе, блокирует потоки в AppDomain.

неназванный мьютекс → аналогичный блокировке, кроме области блокировки, больше, и он через AppDomain в процессе.

Именованный мьютекс → область блокировки - это даже больше, чем неназванный мьютекс, и он проходит через процесс в операционной системе.

Итак, теперь есть варианты, вам нужно выбрать тот, который лучше всего подходит в вашем случае.