条件变量模式-让线程根据条件执行

 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     }

 

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

导航