Mutex 类


一个同步基元,也可用于进程间同步。

System.Object 
   System.MarshalByRefObject
     System.Threading.WaitHandle
       System.Threading.Mutex

命名空间:   System.Threading
程序集:  mscorlib(在 mscorlib.dll 中)
[ComVisibleAttribute(true)]
[HostProtectionAttribute(SecurityAction.LinkDemand, Synchronization = true, 
	ExternalThreading = true)]
publicsealedclass Mutex : WaitHandle

Mutex 类型公开以下成员。

  名称 说明
公共方法由 XNA Framework 提供支持受 可移植类库 支持 Mutex() 使用默认属性初始化 Mutex 类的新实例。
公共方法由 XNA Framework 提供支持受 可移植类库 支持 Mutex(Boolean) 用一个指示调用线程是否应拥有互斥体的初始所属权的布尔值来初始化 Mutex 类的新实例。
公共方法受 可移植类库 支持 Mutex(Boolean, String) 用一个指示调用线程是否应拥有互斥体的初始所属权的布尔值和一个作为互斥体名称的字符串来初始化 Mutex类的新实例。
公共方法受 可移植类库 支持 Mutex(Boolean, String, Boolean) 使用一个指示调用线程是否应拥有互斥体的初始所属权的布尔值、一个作为互斥体名称的字符串,以及一个在方法返回时指示调用线程是否被授予互斥体的初始所属权的布尔值来初始化 Mutex 类的新实例。
公共方法 Mutex(Boolean, String, Boolean, MutexSecurity) 使用一个指示调用线程是否应拥有互斥体的初始所属权的布尔值、一个作为互斥体名称的字符串、一个在方法返回时指示调用线程是否被授予互斥体的初始所属权的布尔变量、以及要应用于已命名的互斥体的访问控制安全性来初始化 Mutex 类的新实例。
页首
  名称 说明
公共属性由 XNA Framework 提供支持 Handle 已过时。获取或设置本机操作系统句柄。 (继承自 WaitHandle。)
公共属性 SafeWaitHandle 获取或设置本机操作系统句柄。 (继承自 WaitHandle。)
页首
  名称 说明
公共方法由 XNA Framework 提供支持 Close 在派生类中被重写时,释放由当前 WaitHandle 持有的所有资源。 (继承自 WaitHandle。)

在 XNA Framework 中,此成员由 Close() 重写。
公共方法 CreateObjRef 创建一个对象,该对象包含生成用于与远程对象进行通信的代理所需的全部相关信息。 (继承自MarshalByRefObject。)
公共方法受 可移植类库 支持 Dispose() 释放由 WaitHandle 类的当前实例使用的所有资源。 (继承自 WaitHandle。)
受保护的方法由 XNA Framework 提供支持受 可移植类库 支持 Dispose(Boolean) 在派生类中被重写时,释放由 WaitHandle 使用的非托管资源,也可以根据需要释放托管资源。 (继承自 WaitHandle。)
公共方法由 XNA Framework 提供支持受 可移植类库 支持 Equals(Object) 确定指定的 Object 是否等于当前的 Object (继承自 Object。)
受保护的方法由 XNA Framework 提供支持受 可移植类库 支持 Finalize 允许对象在“垃圾回收”回收之前尝试释放资源并执行其他清理操作。 (继承自 Object。)
公共方法 GetAccessControl 获取一个 MutexSecurity 对象,该对象表示已命名互斥体的访问控制安全性。
公共方法由 XNA Framework 提供支持受 可移植类库 支持 GetHashCode 用作特定类型的哈希函数。 (继承自 Object。)
公共方法 GetLifetimeService 检索控制此实例的生存期策略的当前生存期服务对象。 (继承自 MarshalByRefObject。)
公共方法由 XNA Framework 提供支持受 可移植类库 支持 GetType 获取当前实例的 Type (继承自 Object。)
公共方法 InitializeLifetimeService 获取控制此实例的生存期策略的生存期服务对象。 (继承自 MarshalByRefObject。)
受保护的方法由 XNA Framework 提供支持受 可移植类库 支持 MemberwiseClone() 创建当前 Object 的浅表副本。 (继承自 Object。)
受保护的方法 MemberwiseClone(Boolean) 创建当前 MarshalByRefObject 对象的浅表副本。 (继承自 MarshalByRefObject。)
公共方法静态成员受 可移植类库 支持 OpenExisting(String) 打开指定名称为 mutex(如果已经存在)。
公共方法静态成员 OpenExisting(String, MutexRights) 用安全访问权限打开指定名称为 mutex(如果已经存在),并返回指示操作是否成功的值。
公共方法由 XNA Framework 提供支持受 可移植类库 支持 ReleaseMutex 释放 Mutex 一次。
公共方法 SetAccessControl 设置已命名的系统互斥体的访问控制安全性。
公共方法由 XNA Framework 提供支持受 可移植类库 支持 ToString 返回表示当前对象的字符串。 (继承自 Object。)
公共方法静态成员 TryOpenExisting(String, Mutex) 打开指定名称为 mutex(如果已经存在),并返回指示操作是否成功的值。
公共方法静态成员 TryOpenExisting(String, MutexRights, Mutex) 用安全访问权限打开指定名称为 mutex(如果已经存在),并返回指示操作是否成功的值。
公共方法由 XNA Framework 提供支持 WaitOne() 阻止当前线程,直到当前 WaitHandle 收到信号。 (继承自 WaitHandle。)

在 XNA Framework 中,此成员由 WaitOne() 重写。
公共方法受 可移植类库 支持 WaitOne(Int32) 阻止当前线程,直到当前 WaitHandle 收到信号,同时使用 32 位带符号整数指定时间间隔。 (继承自WaitHandle。)
公共方法受 可移植类库 支持 WaitOne(TimeSpan) 阻止当前线程,直到当前实例收到信号,同时使用 TimeSpan 指定时间间隔。 (继承自 WaitHandle。)
公共方法由 XNA Framework 提供支持 WaitOne(Int32, Boolean) 阻止当前线程,直到当前的 WaitHandle 收到信号为止,同时使用 32 位带符号整数指定时间间隔,并指定是否在等待之前退出同步域。 (继承自 WaitHandle。)

在 XNA Framework 中,此成员由 WaitOne(Int32, Boolean) 重写。
公共方法 WaitOne(TimeSpan, Boolean) 使用 TimeSpan 指定时间间隔并指定是否在等待之前退出同步域,以此阻止当前线程,直到当前的实例收到信号。 (继承自 WaitHandle。)
页首
  名称 说明
显式接口实现私有方法由 XNA Framework 提供支持 IDisposable.Dispose 基础结构。释放由 WaitHandle 使用的所有资源。 (继承自 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 | ExternalThreadingHostProtectionAttribute 不影响桌面应用程序(这些应用程序通常通过双击图标、键入命令或在浏览器中输入 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();
    }
}

互斥锁(Mutex)是一种用于多线程程序的同步机制,用来避免多个线程同时访问共享资源导致的数据竞争和不一致性问题。互斥锁的特点是同一时刻只有一个线程能够获得锁,从而访问临界区的共享资源。 在C++标准库,`std::mutex`是互斥锁的一个实现。它提供了一系列成员函数来控制对共享资源的访问: - `lock()`:锁定互斥锁,如果该互斥锁已被其他线程锁定,则当前线程将被阻塞,直到获取锁。 - `unlock()`:释放互斥锁,使得其他等待锁的线程可以获取到锁。 - `try_lock()`:尝试锁定互斥锁,如果锁可用,则锁定它并返回true,否则返回false,当前线程不会被阻塞。 `std::mutex`通常是通过RAII(资源获取即初始化)原则来使用的,这通常通过`std::lock_guard`或`std::unique_lock`这包装器来实现。这些包装器在构造函数自动锁定互斥锁,在析构函数自动解锁互斥锁,从而保证了即使在异常发生时也能正确释放锁。 以下是一个简单的`std::mutex`使用示例: ```cpp #include <mutex> #include <thread> std::mutex mtx; // 定义一个互斥锁 void print_even(int n) { for (int i = 0; i < n; ++i) { mtx.lock(); // 锁定互斥锁 if (i % 2 == 0) { std::cout << i << " "; } mtx.unlock(); // 解锁互斥锁 } } void print_odd(int n) { for (int i = 0; i < n; ++i) { mtx.lock(); if (i % 2 != 0) { std::cout << i << " "; } mtx.unlock(); } } int main() { std::thread t1(print_even, 10); std::thread t2(print_odd, 10); t1.join(); t2.join(); return 0; } ``` 在这个例子,两个线程分别打印出0到9的偶数和奇数,互斥锁确保同一时刻只有一个线程能够执行打印操作。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值