八、条件变量std::condition_variable、wait()、notify_one()、notify_all(粗略)
一、std::condition_variable
用在多线程中。
线程A:等待一个条件满足
线程B:专门在消息队列中扔消息,线程B触发了这个条件,A就满足条件了,可以继续执行
std::condition_variable my_cond;//生成一个条件对象
wait()是条件变量的成员函数,用来等一个东西,如果第二个参数lambda表达式返回值是false,那么wait将解锁第一个参数(互斥量),并堵塞到本行。
堵塞到什么时候呢?堵塞到其他某个线程调用notify_one()成员函数为止。如果返回true,那么wait()直接返回。
如果没有第二个参数,就跟默认第二个参数返回false效果一样。
my_cond.notify_one();//尝试吧wait的线程唤醒,执行完这行,wait就被唤醒了
只能通知一个线程,如果两个线程干的不同的事情,都卡在wait,怎么唤醒多个线程?notify_all,这两个线程只有一个线程能获取到锁,另一个没拿到锁,就一直不断的去获得锁
当其他notify_one()将wait唤醒之后,wait不断尝试获取互斥量锁,如果获取不到,流程就卡在wait这里等着获取。如果获取到了,wait就获取到锁(就等于上锁);
(1)如果wait有第二个参数(lambda),就判断这个表达式,如果lambda为false,那么流程如上,又休眠,再等待唤醒;
(2)如果表达式为true,那么wait返回,流程走下来(此时互斥量锁还是锁着的),流程只要能走到这里来,这个互斥量锁一定是锁着的。
(3)如果没有第二个参数,wait就返回,流程走下来
加入A线程正在处理一个事物 ,需要一段时间,并没有卡在wait等你唤醒,那么B线程调用notify_one就没有效果了。
A线程notify_one之后,可能会接着lock,而另一个线程可能也在lock,两个线程谁先拿到锁不一定,所以竞争锁问题出现了。
八、条件变量std::condition_variable、wait()、notify_one()、notify_all(粗略)的更多相关文章
- C++11并发——多线程条件变量std::condition_variable(四)
https://www.jianshu.com/p/a31d4fb5594f https://blog.csdn.net/y396397735/article/details/81272752 htt ...
- C++ 并发编程之互斥锁和条件变量的性能比较
介绍 本文以最简单生产者消费者模型,通过运行程序,观察该进程的cpu使用率,来对比使用互斥锁 和 互斥锁+条件变量的性能比较. 本例子的生产者消费者模型,1个生产者,5个消费者. 生产者线程往队列里放 ...
- c++11の条件变量
一.条件变量的引入 std::condition_variable 解决了死锁并且控制的资源的访问顺序二避免不必要的等待.当互斥操作不够用而引入的.比如,线程可能需要等待某个条件为真才能继续执行,而一 ...
- C11线程管理:条件变量
1.简介 C11提供另外一种用于等待的同步机制,它可以阻塞一个或者多个线程,直到收到另外一个线程发出的通知或者超时,才会唤醒当前阻塞的线程.条件变量要和互斥量配合起来使用. condition_var ...
- boost库(条件变量)
1相关理念 (1)类名 条件变量和互斥变量都是boost库中被封装的类. (2)条件变量 条件变量是thread库提供的一种等待线程同步的机制,可实现线程间的通信,它必须与互斥量配合使用,等待另一个线 ...
- c++11 线程间同步---利用std::condition_variable实现
1.前言 很多时候,我们在写程序的时候,多多少少会遇到下面种需求 一个产品的大致部分流程,由工厂生产,然后放入仓库,最后由销售员提单卖出去这样. 在实际中,仓库的容量的有限的,也就是说,工厂不能一直生 ...
- C++11 多线程同步 互斥锁 条件变量
在多线程程序中,线程同步(多个线程访问一个资源保证顺序)是一个非常重要的问题,Linux下常见的线程同步的方法有下面几种: 互斥锁 条件变量 信号量 这篇博客只介绍互斥量和条件变量的使用. 互斥锁和条 ...
- C++11并行编程-条件变量(condition_variable)详细说明
<condition_variable >头文件主要包含有类和函数相关的条件变量. 包括相关类 std::condition_variable和 std::condition_variab ...
- Windows:C++11并发编程-条件变量(condition_variable)详解
<condition_variable >头文件主要包含了与条件变量相关的类和函数.相关的类包括 std::condition_variable和 std::condition_varia ...
随机推荐
- 涛涛的小马甲 Android之Handler机制
首先需要了解一个基本的概念ANR:Application not response 即应用程序无响应,也就是俗话说的死机. 出现Anr的原因是: 主线程需要做很多重要的事情,响应点击事件,更新UI如果 ...
- php-fpm的执行方式 (进程管理模式)
php-fpm的进程数可以根据设置分为动态和静态. 静态:直接开启指定数量的php-fpm进程,不再增加或者减少: 动态:开始的时候开启一定数量的php-fpm进程,当请求量变大的时候,动态的增加ph ...
- 手机端 ios 浏览器访问报错
原因: ios 隐私模式下 会限制 localstorage 和 sessionstorage 的使用 测试的时候最好看下当前浏览器所处的模式.代码里也要判断 当前是否隐私模式 .告知用户切换模式才能 ...
- find命令之正则表达式
find -regex '.*_\(OK\|NG\).csv'|sort // 特殊字符需要进行转义 for file in `find -regex '.*_\(OK\|NG\).csv'|sort ...
- CF1105C Ayoub and Lost Array ——动态规划
CF1105C Ayoub and Lost Array 题意:一个整数数组,满足: 1. 长度为n 2. 所有元素都在[l, r]范围内 3. 所有元素的和能被3整除给出n, l, r (1 ≤ n ...
- #3831 TJOI2013单词
WOJ#3831 TJOI2013单词 题面 某人读论文,一篇论文是由许多单词组成.但他发现一个单词会在论文中出现很多次,现在想知道每个单词分别在论文中出现多少次. 输入 第一个一个整数 N ,表示有 ...
- Educational Codeforces Round 69 (Rated for Div. 2) A~D Sloution
A. DIY Wooden Ladder 题意:有一些不能切的木板,每个都有一个长度,要做一个梯子,求梯子的最大台阶数 做梯子的木板分为两种,两边的两条木板和中间的若干条台阶木板 台阶数为 $k$ 的 ...
- C++ STL常见数据结构(容器)分类
vector:(连续的空间存储,可以使用[]操作符)快速的访问随机的元素,快速的在末尾插入元素,但是在序列中间的插入,删除元素要慢,而且如果一开始分配的空间不够的话,可能重新分配更大空间,拷贝的性能开 ...
- NavBarControl控件 2015-07-23 16:56 2人阅读 评论(0) 收藏
NavBarControl控件 1. 新建一个windows窗体应用程序项目 2. 在工具箱中的Navigation& Layout选项卡下找到NavBarControl, ...
- supermap idesktop连接oraclesptial数据源
1.要使用相同的版本,如iServer 9D, iDesktop9D ,32位的 plsql,32位的 oracleinstance_client 11g 2.当时遇到的问题是使用oracleinst ...