1.Mutex简介
2.Mutex实战
1.Mutex简介
Mutex 的强大之处在于它是一个系统级别的同步原语, 这意味着它的实现依赖于"操作系统内核"(必须调用Disposable)
a.内核对象
创建一个Mutex时, Windows操作系统会在内核中为你创建一个"互斥体内核对象", 这个对象有两个核心状态:
- signaled(有信号状态): 表示线程可以获取该锁
- un-signaled(无信号状态): 表示锁被某个线程占用
WaitOne()和ReleaseMutex()就是通过这个系统调用与这个内核对象交互
b.线程等待队列
当一个线程调用WaitOne()而Mutex处于non-signaled状态, 这个时候操作系统会将该系统置为等待状态, 并将其放入一个与
该Mutex关联的等待队列中; 这个线程会被挂起, 不会消耗CPU时间
c.释放和调度
当用于Mutex的线程调用ReleaseMutex时:
- 操作系统将Mutex的状态从non-signaled修改为signaled
- 操作系统会从等待队列中唤醒一个正在等待的线程(具体唤醒哪个由系统调度决定)
- 被唤醒的线程获取到Mutex, 操作系统再次将其状态修改为non-signaled, 然后该线程开始执行
这个过程涉及到内核模式的上下文切换, 所以它的性能开销比lock关键字要大
2.Mutex实战
using(Mutex mutex = new Mutex(false, "Global\\MyUniqueMutexName"))
{
if (!mutex.WaitOne(1000))
{
Console.WriteLine("另一个实例正在运行!");
return;
}
try
{
Console.WriteLine("工作开始,按回车退出...");
Console.ReadLine();
}
finally
{
mutex.ReleaseMutex();
}
}