一个同步基元,也可用于进程间同步。
程序集: mscorlib(在 mscorlib.dll 中)
Mutex 类型公开以下成员。
名称 | 说明 | |
---|---|---|
Mutex() | 使用默认属性初始化 Mutex 类的新实例。 | |
Mutex(Boolean) | 用一个指示调用线程是否应拥有互斥体的初始所属权的布尔值来初始化 Mutex 类的新实例。 | |
Mutex(Boolean, String) | 用一个指示调用线程是否应拥有互斥体的初始所属权的布尔值和一个作为互斥体名称的字符串来初始化 Mutex类的新实例。 | |
Mutex(Boolean, String, Boolean) | 使用一个指示调用线程是否应拥有互斥体的初始所属权的布尔值、一个作为互斥体名称的字符串,以及一个在方法返回时指示调用线程是否被授予互斥体的初始所属权的布尔值来初始化 Mutex 类的新实例。 | |
Mutex(Boolean, String, Boolean, MutexSecurity) | 使用一个指示调用线程是否应拥有互斥体的初始所属权的布尔值、一个作为互斥体名称的字符串、一个在方法返回时指示调用线程是否被授予互斥体的初始所属权的布尔变量、以及要应用于已命名的互斥体的访问控制安全性来初始化 Mutex 类的新实例。 |
名称 | 说明 | |
---|---|---|
Handle | 已过时。获取或设置本机操作系统句柄。 (继承自 WaitHandle。) | |
SafeWaitHandle | 获取或设置本机操作系统句柄。 (继承自 WaitHandle。) |
名称 | 说明 | |
---|---|---|
Close | 在派生类中被重写时,释放由当前 WaitHandle 持有的所有资源。 (继承自 WaitHandle。) 在 XNA Framework 中,此成员由 Close() 重写。 | |
CreateObjRef | 创建一个对象,该对象包含生成用于与远程对象进行通信的代理所需的全部相关信息。 (继承自MarshalByRefObject。) | |
Dispose() | 释放由 WaitHandle 类的当前实例使用的所有资源。 (继承自 WaitHandle。) | |
Dispose(Boolean) | 在派生类中被重写时,释放由 WaitHandle 使用的非托管资源,也可以根据需要释放托管资源。 (继承自 WaitHandle。) | |
Equals(Object) | 确定指定的 Object 是否等于当前的 Object。 (继承自 Object。) | |
Finalize | 允许对象在“垃圾回收”回收之前尝试释放资源并执行其他清理操作。 (继承自 Object。) | |
GetAccessControl | 获取一个 MutexSecurity 对象,该对象表示已命名互斥体的访问控制安全性。 | |
GetHashCode | 用作特定类型的哈希函数。 (继承自 Object。) | |
GetLifetimeService | 检索控制此实例的生存期策略的当前生存期服务对象。 (继承自 MarshalByRefObject。) | |
GetType | 获取当前实例的 Type。 (继承自 Object。) | |
InitializeLifetimeService | 获取控制此实例的生存期策略的生存期服务对象。 (继承自 MarshalByRefObject。) | |
MemberwiseClone() | 创建当前 Object 的浅表副本。 (继承自 Object。) | |
MemberwiseClone(Boolean) | 创建当前 MarshalByRefObject 对象的浅表副本。 (继承自 MarshalByRefObject。) | |
OpenExisting(String) | 打开指定名称为 mutex(如果已经存在)。 | |
OpenExisting(String, MutexRights) | 用安全访问权限打开指定名称为 mutex(如果已经存在),并返回指示操作是否成功的值。 | |
ReleaseMutex | 释放 Mutex 一次。 | |
SetAccessControl | 设置已命名的系统互斥体的访问控制安全性。 | |
ToString | 返回表示当前对象的字符串。 (继承自 Object。) | |
TryOpenExisting(String, Mutex) | 打开指定名称为 mutex(如果已经存在),并返回指示操作是否成功的值。 | |
TryOpenExisting(String, MutexRights, Mutex) | 用安全访问权限打开指定名称为 mutex(如果已经存在),并返回指示操作是否成功的值。 | |
WaitOne() | 阻止当前线程,直到当前 WaitHandle 收到信号。 (继承自 WaitHandle。) 在 XNA Framework 中,此成员由 WaitOne() 重写。 | |
WaitOne(Int32) | 阻止当前线程,直到当前 WaitHandle 收到信号,同时使用 32 位带符号整数指定时间间隔。 (继承自WaitHandle。) | |
WaitOne(TimeSpan) | 阻止当前线程,直到当前实例收到信号,同时使用 TimeSpan 指定时间间隔。 (继承自 WaitHandle。) | |
WaitOne(Int32, Boolean) | 阻止当前线程,直到当前的 WaitHandle 收到信号为止,同时使用 32 位带符号整数指定时间间隔,并指定是否在等待之前退出同步域。 (继承自 WaitHandle。) 在 XNA Framework 中,此成员由 WaitOne(Int32, Boolean) 重写。 | |
WaitOne(TimeSpan, Boolean) | 使用 TimeSpan 指定时间间隔并指定是否在等待之前退出同步域,以此阻止当前线程,直到当前的实例收到信号。 (继承自 WaitHandle。) |
当两个或更多线程需要同时访问一个共享资源时,系统需要使用同步机制来确保一次只有一个线程使用该资源。 Mutex 是同步基元,它只向一个线程授予对共享资源的独占访问权。如果一个线程获取了互斥体,则要获取该互斥体的第二个线程将被挂起,直到第一个线程释放该互斥体。
可以使用 WaitHandle.WaitOne 方法请求互斥体的所属权。拥有互斥体的线程可以在对 WaitOne 的重复调用中请求相同的互斥体而不会阻止其执行。但线程必须调用 ReleaseMutex 方法同样多的次数以释放互斥体的所属权。 Mutex 类强制线程标识,因此互斥体只能由获得它的线程释放。相反,Semaphore 类不强制线程标识。
如果线程在拥有互斥体时终止,则称此互斥体被放弃。将此 mutex 的状态设置为收到信号,下一个等待线程将获得所有权。从 .NET Framework 2.0 版开始,在获取被放弃 mutex 的下一个线程中将引发 AbandonedMutexException。在 .NET Framework 2.0 版之前,这样不会引发任何异常。
警告 |
---|
如果出现被放弃的 mutex,通常表明代码中存在严重错误。如果某个线程在未释放互斥体时便退出,受此互斥体保护的数据结构可能处于不一致的状态。如果此数据结构的完整性能得到验证,下一个请求此互斥体所属权的线程就可以处理此异常并继续。 |
对于系统范围的 mutex,被放弃的 mutex 可能指示应用程序已突然终止(例如,通过使用 Windows 任务管理器终止)。
Mutex 有两种类型:未命名的局部 mutex 和已命名的系统 mutex。本地 mutex 仅存在于进程当中。您的进程中任何引用表示 mutex 的 Mutex 对象的线程都可以使用它。每个未命名的 Mutex 对象都表示一个单独的局部 mutex。
已命名的系统互斥体在整个操作系统中都可见,可用于同步进程活动。您可以使用接受名称的构造函数创建表示已命名系统 mutex 的 Mutex 对象。同时也可以创建操作系统对象,或者它在创建 Mutex 对象之前就已存在。您可以创建多个 Mutex 对象来表示同一命名系统 mutex,而且您可以使用OpenExisting 方法打开现有的命名系统 mutex。
说明 |
---|
在运行终端服务的服务器上,已命名的系统 mutex 可以具有两级可见性。如果名称以前缀“Global\”开头,则 mutex 在所有终端服务器会话中均为可见。如果名称以前缀“Local\”开头,则 mutex 仅在创建它的终端服务器会话中可见。在这种情况下,服务器上各个其他终端服务器会话中都可以拥有一个名称相同的独立 mutex。如果创建已命名 mutex 时不指定前缀,则它将采用前缀“Local\”。在终端服务器会话中,只是名称前缀不同的两个 mutex 是独立的 mutex,这两个 mutex 对于终端服务器会话中的所有进程均为可见。即:前缀名称“Global\”和“Local\”说明 mutex 名称相对于终端服务器会话(而并非相对于进程)的范围。 |
说明 |
---|
应用到此类型或成员的 HostProtectionAttribute 特性具有以下 Resources 属性值:Synchronization | ExternalThreading。HostProtectionAttribute 不影响桌面应用程序(这些应用程序通常通过双击图标、键入命令或在浏览器中输入 URL 来启动)。有关更多信息,请参见 HostProtectionAttribute 类或 SQL Server 编程和宿主保护特性。 |
此示例演示如何使用局部 Mutex 对象来同步对受保护资源的访问。
// This example shows how a Mutex is used to synchronize access// to a protected resource. Unlike Monitor, Mutex can be used with// WaitHandle.WaitAll and WaitAny, and can be passed across// AppDomain boundaries.using System; using System.Threading; class Test { // Create a new Mutex. The creating thread does not own the// Mutex.privatestatic Mutex mut = new Mutex(); privateconstint numIterations = 1; privateconstint numThreads = 3; staticvoid Main() { // Create the threads that will use the protected resource.for(int i = 0; i < numThreads; i++) { Thread myThread = new Thread(new ThreadStart(MyThreadProc)); myThread.Name = String.Format("Thread{0}", i + 1); myThread.Start(); } // The main thread exits, but the application continues to// run until all foreground threads have exited. } privatestaticvoid MyThreadProc() { for(int i = 0; i < numIterations; i++) { UseResource(); } } // This method represents a resource that must be synchronized// so that only one thread at a time can enter.privatestaticvoid UseResource() { // Wait until it is safe to enter. mut.WaitOne(); Console.WriteLine("{0} has entered the protected area", Thread.CurrentThread.Name); // Place code to access non-reentrant resources here.// Simulate some work. Thread.Sleep(500); Console.WriteLine("{0} is leaving the protected area\r\n", Thread.CurrentThread.Name); // Release the Mutex. mut.ReleaseMutex(); } }