自旋锁和互斥锁实例_并发编程 C#- (2) Mutex 互斥锁(互斥体)一

功能:

用于线程同步操作的类,保护临界区(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();        }

运行效果:

46d7022e5d05224b2a65c8894da657c5.png

如果放开主线程执行释放锁代码,运行效果:

7c8eebfa987029e5bb5dec6e13b63d26.png

WaitOne()和ReleaseMutex()获取和释放是一对难兄难弟,必须匹配出现,否则程序死等

github代码:https://github.com/LiangZhang/MultiThread-csharp-Toutiao.git

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值