В чем разница между блокировкой и 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 в процессе.
Именованный мьютекс → область блокировки - это даже больше, чем неназванный мьютекс, и он проходит через процесс в операционной системе.
Итак, теперь есть варианты, вам нужно выбрать тот, который лучше всего подходит в вашем случае.