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

 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

条件变量模式-让线程根据条件执行的相关文章

多线程之互斥锁、条件变量

多线程 一个进程在同一时刻只能做一件事,而多个线程却可以同时执行,每个线程处理各自独立的任务.多线程有很多好处: 简化处理异步事件的代码 实现内存和文件描述符的共享 改善程序的吞吐量 改善响应时间 互斥锁 互斥锁:互斥锁通过锁机制来实现线程间的同步,在同一时刻通常只允许一个关键部分的代码 当多个线程控制相同的内存时,对于读写操作的时间差距就有可能会导致数据的不同步,下图就很清晰的说明了这种情况: 对于线程A.B此时对同一块内存进行操作,但是由于操作几乎是同时进行的,假设当线程A读入数据i之后,在

第8章 用户模式下的线程同步(4)_条件变量(Condition Variable)

8.6 条件变量(Condition Variables)——可利用临界区或SRWLock锁来实现 8.6.1 条件变量的使用 (1)条件变量机制就是为了简化 “生产者-消费者”问题而设计的一种线程同步机制.其目的让线程以原子方式释放锁并将自己阻塞,直到某一个条件成立为止.如读者线程当没有数据可读取时,则应释放锁并等待,直到写者线程产生了新的数据.同理,当写者把数据结构写满时,那么写者应该释放SRWLock并等待,直到读者把数据结构清空. (2)等待函数:SleepConditionVariab

浅析线程间通信一:互斥量和条件变量

线程同步的目的简单来讲就是保证数据的一致性.在Linux中,常用的线程同步方法有互斥量( mutex ).读写锁和条件变量,合理使用这三种方法可以保证数据的一致性,但值得的注意的是,在设计应用程序时,所有的线程都必须遵守相同的数据访问规则为前提,才能保证这些同步方法有效,如果允许某个线程在没有得到访问权限(比如锁)的情况下访问共享资源,那么其他线程在使用共享资源前都获得了锁,也会出现数据不一致的问题.另外还有自旋锁.barrier和信号量线程同步方法.本文将讨论互斥量和条件变量的使用,并给出了相

C++11 中的线程、锁和条件变量

转自:http://blog.jobbole.com/44409/ 线程 类std::thread代表一个可执行线程,使用时必须包含头文件<thread>.std::thread可以和普通函数,匿名函数和仿函数(一个实现了operator()函数的类)一同使用.另外,它允许向线程函数传递任意数量的参数. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 #include <thread> void func() {    // do some work } int

linux线程同步(2)-条件变量

一.概述                                                    上一篇,介绍了互斥量.条件变量与互斥量不同,互斥量是防止多线程同时访问共享的互斥变量来保护临界区.条件变量是多线程间可以通过它来告知其他线程某个状态发生了改变,让等待在这个条件变量的线程继续执行.通俗一点来讲:设置一个条件变量让线程1等待在一个临界区的前面,当其他线程给这个变量执行通知操作时,线程1才会被唤醒,继续向下执行. 条件变量总是和互斥量一起使用,互斥量保护着条件变量,防止多个

【转】【C++】C++ 中的线程、锁和条件变量

线程 类std::thread代表一个可执行线程,使用时必须包含头文件<thread>.std::thread可以和普通函数,匿名函数和仿函数(一个实现了operator()函数的类)一同使用.另外,它允许向线程函数传递任意数量的参数. #include <thread> void func() { // do some work } int main() { std::thread t(func); t.join(); return 0; } 上例中,t 是一个线程对象,函数fu

3线程同步:条件变量

1 条件变量 条件变量给多个线程提供了一个汇合的场所. 依赖的头文件 #include<pthread.h> 函数声明 定义分配条件变量 pthread_cond_t cond =PTHREAD_COND_INITIALIZER; int pthread_cond_init(pthread_cond_t*restrict cond, const pthread_condattr_t *restrict attr); 名称: pthread_cond_init 功能: initialize co

c++11线程之条件变量condition_variable(二)

题目:编写一个程序,开启3个线程,这3个线程的ID分别为A.B.C,每个线程将自己的ID在屏幕上打印10遍,要求输出结果必须按ABC的顺序显示:如:ABCABC-.依次递推. 采用C++11实现: [cpp] view plaincopyprint? #include<iostream> #include<thread> #include<mutex> #include<condition_variable> using namespace std; mut

线程同步——条件变量

1.互斥量的存在问题:     互斥量是线程程序必需的工具,但它们并非万能的.例如,如果线程正在等待共享数据内某个条件出现,那会发生什么呢?它可以重复对互斥对象锁定和解锁,每次都会检查共享数据结构,以查找某个值.但这是在浪费时间和资源,而且这种繁忙查询的效率非常低. 在每次检查之间,可以让调用线程短暂地进入睡眠,比如睡眠三秒钟,但是因此线程代码就无法最快作出响应.真正需要的是这样一种方法:当线程在等待满足某些条件时使线程进入睡眠状态.一旦条件满足,就唤醒因等待满足特定条件而睡眠的线程.如果能够做