1 internal sealed class SimpleWaitLock:IDisposable 2 { 3 //Enter()和Leave()中使用m_AutoResetEvent都将迫使调用线程做用户模式和内核模式间的转换,这点十分影响性能 4 //存在竞争时,输掉的线程会被内核阻止,内核阻止的特点是线程不会“自旋”,从而节省了CPU 5 private readonly AutoResetEvent m_AutoResetEvent; 6 7 public SimpleWaitLock() 8 { 9 //初始化可自由使用 10 //true将初始状态设置为终止状态,false非终止 11 //true有信号(不会阻塞),false无信号 12 m_AutoResetEvent = new AutoResetEvent(true); 13 } 14 15 public void Enter() 16 { 17 //WaitOne()将阻塞到其有信号为止 18 //若调用WaitOne的时候就有信号则不会阻塞 19 //在内核中阻塞,直到资源可用 20 m_AutoResetEvent.WaitOne(); 21 } 22 23 public void Leave() 24 { 25 //将状态设置为有信号 26 //通知其它(AutoResetEvent保证只会有一个)线程使用资源 27 m_AutoResetEvent.Set(); 28 } 29 30 public void Dispose() 31 { 32 m_AutoResetEvent.Dispose(); 33 } 34 }