简单混合锁(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     }

 

posted on 2018-05-12 11:18  庭前花满留晚照  阅读(963)  评论(0编辑  收藏  举报

导航