Mutex(互斥体):
排他性的使用共享资源称为线程间的互斥。
使用Mutex类要比使用monitor类消耗更多的系统资源,但他可以跨越多个应用程序,在多个应用程序间同步。
构造函数
Mutex() | 使用默认属性初始化 Mutex 类的新实例。 |
Mutex(Boolean) | 用一个指示调用线程是否应拥有互斥体的初始所属权的布尔值来初始化 Mutex 类的新实例。 |
Mutex(Boolean, String) | 用一个指示调用线程是否应拥有互斥体的初始所属权的布尔值和一个作为互斥体名称的字符串来初始化 Mutex 类的新实例。 |
Mutex(Boolean, String, Boolean) | 使用可指示调用线程是否应具有互斥体的初始所有权以及字符串是否为互斥体的名称的 Boolean 值和当线程返回时可指示调用线程是否已赋予互斥体的初始所有权的 Boolean 值初始化 Mutex 类的新实例。 |
Mutex(Boolean, String, Boolean, MutexSecurity) | 使用可指示调用线程是否应具有互斥体的初始所有权以及字符串是否为互斥体的名称的 Boolean 值和当线程返回时可指示调用线程是否已赋予互斥体的初始所有权以及访问控制安全是否已应用到命名互斥体的 Boolean变量初始化 Mutex 类的新实例。 |
方法
Close() | 释放由当前 WaitHandle 占用的所有资源。 |
CreateObjRef(Type) | 创建一个对象,该对象包含生成用于与远程对象进行通信的代理所需的全部相关信息。 |
Dispose() | 释放 WaitHandle 类的当前实例所使用的所有资源。 |
Dispose(Boolean) | 当在派生类中重写时,释放 WaitHandle 使用的非托管资源,并且可选择释放托管资源。 |
Equals(Object) | 确定指定的对象是否等于当前对象。 |
GetAccessControl() | 获取一个 MutexSecurity 对象,该对象表示已命名互斥体的访问控制安全性。 |
GetHashCode() | 作为默认哈希函数。 |
GetLifetimeService() | 检索控制此实例的生存期策略的当前生存期服务对象。 |
GetType() | 获取当前实例的 Type。 |
InitializeLifetimeService() | 获取生存期服务对象来控制此实例的生存期策略。 |
MemberwiseClone() | 创建当前 Object 的浅表副本。 |
MemberwiseClone(Boolean) | 创建当前 MarshalByRefObject 对象的浅表副本。 |
OpenExisting(String) | 打开指定名称为 mutex(如果已经存在)。 |
OpenExisting(String, MutexRights) | 用安全访问权限打开指定名称为 mutex(如果已经存在),并返回指示操作是否成功的值。 |
ReleaseMutex() | 释放 Mutex 一次。 |
SetAccessControl(MutexSecurity) | 设置已命名的系统互斥体的访问控制安全性。 |
ToString() | 返回表示当前对象的字符串。 |
TryOpenExisting(String, Mutex) | 打开指定的已命名的互斥体(如果已经存在),并返回指示操作是否成功的值。 |
TryOpenExisting(String, MutexRights, Mutex) | 利用所需的安全访问权限,打开指定的已命名的互斥体(如果已经存在),并返回指示操作是否成功的值。 |
WaitOne() | 阻止当前线程,直到当前 WaitHandle 收到信号。 |
WaitOne(Int32) | 阻止当前线程,直到当前 WaitHandle 收到信号 |
WaitOne(Int32, Boolean) | 阻止当前线程,直到当前的 WaitHandle 收到信号为止 |
WaitOne(TimeSpan) | 阻止当前线程,直到当前实例收到信号,同时使用 TimeSpan 指定时间间隔。 |
WaitOne(TimeSpan, Boolean) | 阻止当前线程,直到当前实例收到信号为止,同时使用 TimeSpan 指定时间间隔 |
属性
Handle | 获取或设置本机操作系统句柄。 |
SafeWaitHandle | 获取或设置本机操作系统句柄。 |
局部互斥:
使用方法与Monitor类似
系统互斥:
在声明mutex对象时,在构造函数中传入该线程的名字,两个应用线程的名字相同,我们就认为该mutex线程时系统互斥线程
// 参数(bool, 互斥体名称只有两个应用中互斥体名称相同时才是系统互斥) Mutex mutexbb = new Mutex(false, "MutexForTimeRecordFile");
程序A:
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Threading; using System.IO; namespace mutexaaa { class Program { static void Main(string[] args) { Thread thread = new Thread(delegate() { // 参数(bool,互斥体名称,只有两个应用中互斥体名称相同时,才是系统互斥) Mutex mutex = new Mutex(false,"MutexForTimeRecordFile"); string content = @"F:codeFilesfile.txt"; try { for (int i = 0; i < 10; i++) { mutex.WaitOne(); File.AppendAllText(content, "metuxaaa" + DateTime.Now + " "); Console.WriteLine("线程开启"); } } catch (Exception qq) { Console.WriteLine(qq.Message); } finally { mutex.ReleaseMutex(); } Thread.Sleep(1000); }); thread.Start(); Console.ReadLine(); } } }
程序B:
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Threading; using System.IO; namespace mutexbbb { class Program { static void Main(string[] args) { Thread threadb = new Thread(delegate() { // 参数(bool,互斥体名称,只有两个应用中互斥体名称相同时,才是系统互斥) Mutex mutexbb = new Mutex(false, "MutexForTimeRecordFile"); string content = @"F:codeFilesfile.txt"; try { for (int i = 0; i < 10; i++) { mutexbb.WaitOne(); File.AppendAllText(content, "metuxbbb" + DateTime.Now + " "); } Console.WriteLine("线程b开启"); } catch (Exception qq) { Console.WriteLine("线程b被中断"); } finally { mutexbb.ReleaseMutex(); } Thread.Sleep(1000); }); threadb.Start(); // 打开另一个应用程序 System.Diagnostics.Process.Start("mutexaaa.exe"); Console.ReadLine(); } } }
以上两个程序是控制台应用程序。可以运行查看下效果。