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

Posted 庭前花满留晚照

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了条件变量模式-让线程根据条件执行相关的知识,希望对你有一定的参考价值。

 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     }

 

以上是关于条件变量模式-让线程根据条件执行的主要内容,如果未能解决你的问题,请参考以下文章

Linux Posix线程条件变量

自动刷新android片段,直到满足条件

互斥锁自旋锁读写锁和条件变量

如何有条件地同时多线程和更新变量?

线程同步

C++实现 生产者消费者模型