lock和Mutex有什么区别?
lock和Mutex有什么区别? 为什么它们不能互换使用?
锁是特定于AppDomain的,而操作系统的互斥允许您执行跨进程locking和同步。
lock
是一个编译器关键字,而不是实际的类或对象。 这是Monitor
类function的一个包装,旨在使Monitor
更容易处理常见的情况。
Monitor
(和lock
关键字),正如Darin所说,限于AppDomain
。 主要是因为需要引用一个内存地址(以实例化对象的forms)来pipe理“locking”并保持Monitor
的身份
另一方面, Mutex
是围绕操作系统构造的.Net包装,可用于系统范围的同步,使用string数据 (而不是指向数据的指针)作为其标识符。 两个互斥体在两个完全不同的内存地址中引用两个string,但具有相同的数据 ,实际上将使用相同的操作系统互斥体。
Mutex
可以是本地的进程或全系统 。 MSDN :
互斥体有两种types:未命名的本地互斥体和命名系统互斥体。 本地互斥体仅存在于您的进程中。
而且,当在具有terminal服务的系统上使用系统范围的互斥时,还应该特别小心 – 在同一页面上详细说明。
Mutex
和lock
之间的差异之一是Mutex
使用内核级构造 ,所以同步总是需要至less一个用户空间 – 内核空间转换。
lock
– 这实际上是Monitor
类的一个快捷方式,另一方面试图避免分配内核资源和转换到内核代码(因此更加精简和更快 – 如果必须find它类似的WinAPI结构,它将是CriticalSection
)。
另外一个区别是别人指出:一个已命名的 Mutex
可以跨进程使用。
除非有特殊需求或者需要跨进程同步,否则坚持lock
(又称Monitor
)是更好的select
还有其他几个“小”的区别,比如放弃如何处理等等。
关于3.5中的ReaderWriterLock
和ReaderWriterLockSlim
, Semaphore
和.NET 4.0中新的SemaphoreSlim
等等也是如此。确实,后者的xxSlim
类不能被用作系统级的同步原语,但他们从来没有这样想过 – 他们是“唯一的”意味着更快,更资源友好。
我使用互斥体来检查是否已经有在同一台机器上运行的应用程序的副本。
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);
互斥是一个跨进程,将有一个经典的例子,不运行一个以上的应用程序实例。
第二个例子是说你有一个文件,你不希望不同的进程访问同一个文件,你可以实现一个互斥量,但记住一件事互斥量是一个操作系统广泛,不能在两个远程过程之间使用。
锁是保护你的代码的一个最简单的方法,它是特定于应用程序的,如果你想要更多的控制同步,你可以用Moniters代替锁。
已经有很多人说过了,但为了简单起见,这是我的看法。
锁 – >使用简单,在监视器上的包装,跨AppDomain中的线程locking。
未命名的互斥体 – >类似于锁,除了locking范围更多,它在一个进程中跨AppDomain。
被称为互斥体 – >locking范围甚至比无名互斥体还要多,它在操作系统中跨越进程。
所以现在有select,你需要select一个最适合你的情况。