1.5 Mutex

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实战

// 在程序A和程序B中,使用相同的名字创建Mutex
// 第一个参数:false 表示调用线程不立即拥有其初始所有权。
using(Mutex mutex = new Mutex(false, "Global\\MyUniqueMutexName"))
{
	// 尝试获取
	if (!mutex.WaitOne(1000)) // 等待1秒
	{
	    Console.WriteLine("另一个实例正在运行!");
	    return;
	}
	
	// 保证单实例运行,或者进程间同步
	try
	{
	    // 做你的工作...
	    Console.WriteLine("工作开始,按回车退出...");
	    Console.ReadLine();
	}
	finally
	{
	    mutex.ReleaseMutex();
	}
}
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值