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