功能:
用于线程同步操作的类,保护临界区(Critical Section)代码,例如,当多个线程同时访问一个资源时保证一次只能有一个线程访问资源。
特征:
1,互斥锁是一个互斥的同步对象,意味着同一时间有且仅有一个线程可以获取它
2.互斥锁可适用于一个共享资源每次只能被一个线程访问的情况
3.如果要获取一个互斥锁。应调用互斥锁上的WaitOne()方法,该方法继承于Thread.WaitHandle类,它处于等待状态直至所调用互斥锁可以被获取,因此该方法将阻止住主调线程直到指定的互斥锁可用,如果不需要拥有互斥锁,用ReleaseMutex方法释放,从而使互斥锁可以被另外一个线程所获取。
语法:Mutex (bool initiallyOwned, string name, out bool createdNew);
@param initiallyOwned.一个指示调用线程是否应拥有互斥锁的初始所属权的布尔值
@param name.一个作为互斥锁名称的字符串
@param createdNew.一个在方法返回时指示调用线程是否被授予互斥体的初始所属权的布尔值来初始化 Mutex类的新实例
eg1:声明一个主线程拥有互斥锁的初始所属权,如果不执行释放代码,那么t1线程始终不能获取到锁,程序死等
static void Main(string[] args) { Thread.CurrentThread.Name = "Main"; const string MutexName = "Mutex-Test"; var m = new Mutex(true, MutexName); print("执行代码逻辑..."); //m.ReleaseMutex(); Thread t1 = new Thread(() => { print("执行代码逻辑..."); m.WaitOne(); print("获得了Mutex锁"); m.ReleaseMutex(); }); t1.Name = "t1"; t1.Start(); t1.Join(); wait(); }
运行效果:
如果放开主线程执行释放锁代码,运行效果:
WaitOne()和ReleaseMutex()获取和释放是一对难兄难弟,必须匹配出现,否则程序死等
github代码:https://github.com/LiangZhang/MultiThread-csharp-Toutiao.git