1 /// <summary>
2 /// 条件变量模式
3 /// 让线程根据条件执行
4 /// </summary>
5 public sealed class ConditionVariablePattern
6 {
7 //两个线程使用同一个锁
8 private readonly object m_lock = new object();
9
10 //复合条件(此处只是简单的Boolean类型)
11 private bool m_condition = false;
12
13 public void Thread1()
14 {
15 //在指定对象上获取排他锁
16 Monitor.Enter(m_lock);
17
18 //在锁中原子性的测试复合条件
19 //条件不满足时
20 while (!m_condition)
21 {
22 //临时释放锁,使其它线程能够获取它
23 //等待另一个线程更改条件
24 //释放对象上的锁并阻止当前线程,直到它重新获取该锁
25 Monitor.Wait(m_lock);
26 }
27
28 //走到这里表示条件满足,可以处理自己的业务
29
30 //永久释放锁
31 Monitor.Exit(m_lock);
32 }
33
34 public void Thread2()
35 {
36 //获取一个互斥锁
37 Monitor.Enter(m_lock);
38
39 //处理业务数据,修改条件
40 m_condition = true;
41
42 //解除线程阻塞可能会浪费一些CPU时间
43 //通知等待队列中的线程锁定对象状态的更改
44 //即释放锁之后唤醒一个正在等待的线程
45 //Monitor.Pulse(m_lock);
46
47 //解除线程阻塞可能会浪费一些CPU时间
48 //通知所有的等待线程对象状态的更改
49 //即释放锁之后唤醒所有正在等待的线程
50 Monitor.PulseAll(m_lock);
51
52 //释放锁
53 Monitor.Exit(m_lock);
54 }
55 }