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 }