简单混合锁(HybridLock)

 1     internal sealed class SimpleHybridLock : IDisposable
 2     {
 3         //基元用户模式构造使用
 4         private int m_waiters = 0;
 5 
 6         //基元内核模式构造
 7         private AutoResetEvent m_waiterLock = new AutoResetEvent(false);
 8 
 9         public void Enter()
10         {
11             //指出该线程想要获得锁
12             if (Equals(Interlocked.Increment(ref m_waiters), 1))
13             {
14                 //无竞争,直接返回
15                 return;
16             }
17 
18             //另一个线程拥有锁(发生竞争),使这个线程等待
19             //线程会阻塞,但不会在CPU上“自旋”,从而节省CPU
20             //这里产生较大的性能影响(用户模式与内核模式之间转换)
21             //待WaitOne返回后,这个线程拿到锁
22             m_waiterLock.WaitOne();
23         }
24 
25         public void Leave()
26         {
27             //该线程准备释放锁
28             if (Equals(Interlocked.Decrement(ref m_waiters), 0))
29             {
30                 //无线程等待,直接返回
31                 return;
32             }
33 
34             //有线程等待则唤醒其中一个
35             //这里产生较大的性能影响(用户模式与内核模式之间转换)
36             m_waiterLock.Set();
37         }
38 
39         public void Dispose()
40         {
41             m_waiterLock.Dispose();
42         }
43     }

 

转载于:https://www.cnblogs.com/xuejietong/p/8640888.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值