Mutex

更新:2007 年 11 月

可以使用 Mutex 对象提供对资源的独占访问。Mutex 类比 Monitor 类使用更多系统资源,但是它可以跨应用程序域边界进行封送处理,可用于多个等待,并且可用于同步不同进程中的线程。有关托管同步机制的比较,请参见 同步基元概述

有关代码示例,请参见 Mutex 构造函数的参考文档。

使用 Mutex

线程调用 mutex 的 WaitOne 方法请求所有权。该调用会一直阻塞到 mutex 可用,或直至达到可选的超时间隔。如果没有任何线程拥有它,则 Mutex 的状态为已发信号的状态。

线程通过调用其 ReleaseMutex 方法释放 mutex。mutex 具有线程关联;即 mutex 只能由拥有它的线程释放。如果线程释放不是它拥有的 mutex,则会在该线程中引发 ApplicationException

由于 Mutex 类从 WaitHandle 派生,所以您还可以结合其他等待句柄调用 WaitHandle 的静态 WaitAllWaitAny 方法请求 Mutex 的所有权。

如果某个线程拥有 Mutex,则该线程就可以在重复的等待-请求调用中指定同一个 Mutex,而不必阻止其执行;但是,它必须释放 Mutex,次数与释放所属权的次数相同。

被放弃的 Mutex

如果线程终止而未释放 Mutex,则认为该 mutex 已放弃。这通常指示存在严重的编程错误,因为该 mutex 正在保护的资源可能会处于不一致的状态。在 .NET Framework 2.0 版中,获取该 mutex 的下一个线程中将引发 AbandonedMutexException

说明:

在 .NET Framework 1.0 和 1.1 版中,放弃的 Mutex 被设置为已发送信号状态,下一个等待线程将获得所有权。如果没有等待线程,则 Mutex 保持已发送信号状态。不引发异常。

对于系统范围的 mutex,被放弃的 mutex 可能指示应用程序已突然终止(例如,通过使用 Windows 任务管理器终止)。

本地 mutex 和系统 mutex

Mutex 分两种类型:本地 mutex 和命名系统 mutex。如果使用接受名称的构造函数创建了 Mutex 对象,那么该对象将与具有该名称的操作系统对象相关联。命名的系统 mutex 在整个操作系统中都可见,并且可用于同步进程活动。您可以创建多个 Mutex 对象来表示同一命名系统 mutex,而且您可以使用 OpenExisting 方法打开现有的命名系统 mutex。

本地 mutex 仅存在于进程当中。进程中引用本地 Mutex 对象的任意线程都可以使用本地 mutex。每个 Mutex 对象都是一个单独的本地 mutex。

系统 mutex 的访问控制安全性

.NET Framework 2.0 版提供查询和设置命名的系统对象的 Windows 访问控制安全性的能力。建议从创建那一刻起就开始保护系统 mutex,因为系统对象是全局对象,因此可能被您自己的代码以外的代码锁定。

有关 mutex 的访问控制安全性的信息,请参见 MutexSecurityMutexAccessRule 类、MutexRights 枚举、Mutex 类的 GetAccessControlSetAccessControlOpenExisting 方法以及 Mutex(Boolean, String, Boolean%, MutexSecurity) 构造函数。

请参见

概念

监视器

线程与线程处理

参考

Mutex

Mutex

MutexSecurity

MutexAccessRule

其他资源

托管线程处理

线程处理对象和功能