八、条件变量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 ...
随机推荐
- leetcode 148. 排序链表(c++)
在 O(n log n) 时间复杂度和常数级空间复杂度下,对链表进行排序. 示例 1: 输入: 4->2->1->3输出: 1->2->3->4示例 2: 输入: ...
- IntelliJ IDEA中创建xml文件
1.file—setting,左上角输入template, 2.在左侧栏找到File And Code Templates 3.中间选中Files 4.点击+号,添加模板 5.输入模板名字:Nam ...
- for的循环题
package Tony2;import java.util.Scanner; public class Day27 { public static void main(String[] args) ...
- shell脚本一一项目4
主题:一键查看服务器使用率 cpu vmstat suyu wa memery free disk df -h /dev tcp连接数 netstat cpu(){ used=$(vmstat ...
- GARENA笔试sql20190926
create database garena; use garena; create table players( account_id int, name varchar(20), country ...
- Java IO(1)
IO这一部分内容还是比较多的,对于基础的枯燥但是又重要的内容还是将它记下来比较好. 关于File类 Ø File类直接继承与Object类,File类描述了文件本身的一些属性,File类用来获取或者处 ...
- python datetime模块的strftime()
strftime() 可以对datetime对象进行格式化,生成需要时间格式的时间 strptime() 可以对格式化后的时间再生成datetime对象 格式化时间时,如果不想要-来隔开,还可以 ...
- Throwable -抛出异常类与自定义异常类
/* 自定义异常类 java提供的异常类,不够我们使用,需要自己定义一些异常类 格式: public class XXXException extends Exception/runtimeExcep ...
- [Bzoj1047][HAOI2007]理想的正方形(ST表)
题目链接:https://www.lydsy.com/JudgeOnline/problem.php?id=1047 题目虽然有一个n的限制,但求二维区间最值首先想到的还是RMQ,但是如果按照往常RM ...
- python面试题之Python 的特点和优点是什么
Python 可以作为编程的入门语言,因为他具备以下特质: 1. 解释性 2. 动态特性 3. 面向对象 4. 语法简洁 5. 开源 6. 丰富的社区资源 7 库丰富 文章转载自Python黑洞网