lock和Mutex有什么区别?

Ram*_*Ram 117 c# multithreading synchronization

lock和Mutex有什么区别?为什么他们不能互换使用?

Dar*_*rov 133

甲锁是特定于应用程序域,而互斥给操作系统使用户可以执行进程间锁定和同步(IPC).


Tob*_*oby 87

lock是编译器关键字,而不是实际的类或对象.它是Monitor类的功能包装,旨在使Monitor常见的案例更容易使用.

的Monitor(和lock关键字)是,如达林所述,受限于AppDomain.主要是因为需要引用内存地址(以实例化对象的形式)来管理"锁定"并保持其身份Monitor

的Mutex,在另一方面,是围绕一操作系统构建体的.NET包装,并且可以使用串被用于系统范围内同步,数据(而不是数据指针)作为其识别符.在两个完全不同的内存地址中引用两个字符串但具有相同数据的两个互斥锁实际上将使用相同的操作系统互斥锁.


And*_*ass 49

A Mutex可以是进程本地的,也可以是系统范围的.MSDN:

互斥锁有两种类型:本地互斥锁(未命名)和命名系统互斥锁.本地互斥锁仅存在于您的进程中.

此外,在具有终端服务的系统上使用系统范围的互斥锁时,应特别注意 - 在同一页面上详细说明.

Mutex和之间的区别之一lock是Mutex利用内核级构造,因此同步将始终至少需要用户空间 - 内核空间转换.

lock- 这实际上是Monitor类的快捷方式,另一方面试图避免分配内核资源并转换到内核代码(因此更精简和更快 - 如果必须找到类似的WinAPI构造,那就是CriticalSection).

另一个区别是其他人指出:命名 Mutex 可以跨进程使用.

除非有特殊需求或需要跨进程同步,否则最好坚持lock(又名Monitor)˛

还有其他一些"轻微"差异,例如如何处理放弃等.

也可以这样说,大约ReaderWriterLock和ReaderWriterLockSlim3.5,Semaphore以及新SemaphoreSlim的.NET 4.0等,后者是真正的xxSlim类不能被用来作为一个全系统的同步原语,但他们从来没有准备-他们是"唯一"的意思更快,更资源友好.


Jon*_*han 23

我使用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);
Run Code Online (Sandbox Code Playgroud)


Tal*_*ner 6

Mutex是一个跨进程,将有一个不运行多个应用程序实例的经典示例.

第二个例子是说你有一个文件并且你不希望不同的进程访问同一个文件,你可以实现一个Mutex但是记住一件事Mutex是一个操作系统范围而且不能在两个远程进程之间使用.

Lock是保护代码段的最简单方法,它是特定于appdomain的,如果你想要更多的受控同步,你可以用Moniters替换锁.


Pra*_*thi 5

已经说了很多,但是为了简单起见,这是我的观点。

lock- >简单易用,在监视器上包装,可在AppDomain中跨线程锁定。

未命名的互斥锁 ->与锁类似,但锁范围更大,并且在整个过程中贯穿AppDomain。

命名互斥锁 ->锁定范围甚至比未命名的互斥锁还多,并且它在操作系统中跨进程。

因此,现在有了选项,您需要选择最适合自己的情况。