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 }
原文地址:https://www.cnblogs.com/xuejietong/p/9021974.html
时间: 2024-10-12 02:58:49