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 }