C++ 11 深度学习(十七)condition_variable、wait

简介

条件变量std::condition_variable的作用是阻塞线程,然后等待通知将其唤醒。我们可以通过某个函数判断是否符合某种条件来决定是阻塞线程等待通知还是唤醒线程,由此实现线程间的同步。所以简单来说condition_variable的作用就两个——等待(wait)、通知(notify)。下面详细介绍一下。


等待线程

condition_variable的等待函数有三个,分别是wait()——等待、wait_for()——等待一段时间、wait_until()——等待至某一时刻。另外针对每个函数condition_variable还提供了有条件等待和无条件等待两种方式。下面具体讲解一下。

wait()

wait()的是普通的等待。分为有条件的等待和无条件的等待。

函数声明说明
void wait (unique_lock& lck)无条件的等待
void wait (unique_lock& lck, Predicate pred)有条件的等待
  • void wait (unique_lock& lck)会无条件的阻塞当前线程然后等待通知,前提是此时对象lck已经成功获取了锁。等待时会调用lck.unlock()释放锁,使其它线程可以获取锁。一旦得到通知(由其他线程显式地通知),函数就会释放阻塞并调用lck.lock(),使lck保持与调用函数时相同的状态。然后函数返回,注意,最后一次lck.lock()的调用可能会在返回前再次阻塞线程。
     
#include <iostream>           
#include <thread>             
#include <mutex>              
#include <condition_variable> 
#include <windows.h>std::condition_variable cv;int value;void read_value() {std::cin >> value;cv.notify_one();
}int main()
{std::cout << "Please, enter an integer (I'll be printing dots): \n";std::thread th(read_value);std::mutex mtx;std::unique_lock<std::mutex> lck(mtx);cv.wait(lck);std::cout << "You entered: " << value << '\n';th.join();return 0;
}

输出

Please, enter an integer (I'll be printing dots):
7
You entered: 7

wati()函数因为没有条件判断,因此有时候会产生虚假唤醒,而有条件的等待可以很好的解决这一问题。

  • void wait (unique_lock& lck, Predicate pred)为有条件的等待,pred是一个可调用的对象或函数,它不接受任何参数,并返回一个可以作为bool计算的值。当pred为false时wait()函数才会使线程等待,在收到其他线程通知时只有当pred返回true时才会被唤醒。我们将上述代码做如下修改,它的输出与上述一样。
bool istrue()
{return value != 0;
}int main()
{std::cout << "Please, enter an integer (I'll be printing dots): \n";std::thread th(read_value);std::mutex mtx;std::unique_lock<std::mutex> lck(mtx);cv.wait(lck,istrue);std::cout << "You entered: " << value << '\n';th.join();return 0;
}

借助条件判断我们还可以做更加复杂的操作。

#include <iostream>           
#include <thread>             
#include <mutex>              
#include <condition_variable> std::mutex mtx;
std::condition_variable cv;int cargo = 0;
bool shipment_available() {return cargo!=0;}void consume (int n) {for (int i=0; i<n; ++i) {std::unique_lock<std::mutex> lck(mtx);cv.wait(lck,shipment_available);// consume:std::cout << cargo << '\n';cargo=0;}
}int main ()
{std::thread consumer_thread (consume,10);// produce 10 items when needed:for (int i=0; i<10; ++i) {while (shipment_available()) std::this_thread::yield();std::unique_lock<std::mutex> lck(mtx);cargo = i+1;cv.notify_one();}consumer_thread.join();return 0;
}

输出

1
2
3
4
5
6
7
8
9
10


 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/335764.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【WebRTC---源码篇】(六)NACK判断包位置的关键算法

首先保证a与b不相等 template <typename T, T M = 0> inline bool AheadOf(T a, T b) {static_assert(std::is_unsigned<T>::value,"Type must be an unsigned integer.");return a != b && AheadOrAt<T, M>(a, b); } template <type…

spring集成mq_使用Spring Integration Java DSL与Rabbit MQ集成

spring集成mq我最近参加了在拉斯维加斯举行的2016年Spring大会 &#xff0c;很幸运地看到了我在软件世界中长期敬佩的一些人。 我亲自遇到了其中的两个人&#xff0c;他们实际上合并了几年前我与Spring Integration相关的一些次要贡献– Gary Russel和Artem Bilan &#xff0c;…

blt功能_BitBlt实现TransparentBlt

文章用BitBlt实现了TransparentBlt的功能&#xff0c;主要的工作如下&#xff1a;void TransparentBlt2(HDC hdcDest, // 目标DCint nXOriginDest, // 目标X偏移int nYOriginDest, // 目标Y偏移int nWidthDest, // 目标宽度int nHeightDest, // 目标高度HDC hdcSrc, // 源DCint…

MyEclipse 如何使用断点调试

文章目录1、在需要的代码行处打断点右键添加断点双击添加断点快捷键添加断点2、以debug模式开启服务器通过debug执行列表&#xff0c;选择服务器启动当前程序按右键&#xff0c;选择debug as&#xff0c;再选择服务器启动开发视图底部server列表选择服务器开启debug视图&#x…

【WebRTC---源码篇】(八)音频数据采集

ADM的创建 1.Audio Device Module是在逻辑层与硬件设备层之间进行了转换,需要使用什么功能,调用什么接口就可以,不要管底层平台实现。 2.AudioDeviceModule是一个接口类,定义了一系列接口。最终实现由子类AudioDeviceModuleForTest实现,其中包括一些测试函数(对设备的…

openlayers地图旋转_地图切换动画#openlayers入门笔记#

本博客合集是我的openlayers学习笔记&#xff0c;希望能帮助到刚开始接触openlayers的同学commnet 所用openlayers版本&#xff1a;v5.3.0commnet 阅读本文前需要对前端知识有一定的了解comment 本文内容只提供参考&#xff0c;建议结合openlayers官网的API和examples来学习com…

6种漂亮的线条

第一种&#xff1a; <hr style" height:2px;border:none;border-top:2px dotted #185598;" /> height:2px;是hr的高度 border:none;是没有边框 border-top:2px dotted #185598;是设置横线的样式 dotted 点线 #185598 颜色 第二种&#xff1a; <hr st…

jsf netbeans_NetBeans Java EE技巧9:从数据库创建JSF应用程序

jsf netbeans您需要非常快速地创建数据库前端吗&#xff1f; NetBeans IDE允许人们以很少的代码就为一组数据库表开发JSF应用程序前端。 现在&#xff0c;本教程是一个老歌&#xff0c;但是一个好东西……对于那些不了解它的人来说&#xff0c;值得再次提及。 首先&#xff0c…

python内置属性类_Python内置类属性,元类研究

Python内置类属性我觉得一切都是对象&#xff0c;对象和元类对象&#xff0c;类对象其实都是一样的&#xff0c;我在最后进行了证明&#xff0c;但是只能证明一半&#xff0c;最后由于元类的父类是type&#xff0c;他可以阻挡对object属性的访问&#xff0c;告终__dict__ : 类的…

java向后兼容吗_Java向后不兼容历史的观察

java向后兼容吗在大多数情况下&#xff0c;Java是一个非常向后兼容的编程语言。 这样做的好处是&#xff0c;与大规模破坏兼容性相比&#xff0c;大型系统通常可以相对轻松的方式升级为使用Java的较新版本。 这样做的主要缺点是Java坚持了一些设计决策&#xff0c;这些决策自那…

转义字符的整理

文章目录转义符号 \转义字符清单换行符横向制表符空格编码符转义符号 \ 反斜杠\在程序设计中称为转义符&#xff0c;用来表示那些不能直接显示的字符。例如&#xff1a;换行。 在不同的系统中换行的表示又不相同&#xff0c;在Unix中换行符是\n,而在Windows中换行符是\r\n&…

cloud foundry_介绍“又一个” Cloud Foundry Gradle插件

cloud foundry在与两个同事&#xff08;感谢Mark Alston和Dave Malone &#xff01;&#xff09;一起使用自动Jenkins管道部署Cloud Foundry应用程序的过程中&#xff0c;我决定尝试编写Gradle插件来执行一些通常需要完成的任务使用命令行Cloud Foundry Client完成 。 引入一个…

C++ 11 深度学习(十八)模板概念,函数模板定义、调用

模板作为一个框架&#xff0c;通过传入的参数&#xff0c;来具体实例化想要的东西。 1.模板定义是用template关键字开头的&#xff0c;后跟<>,<>里面叫模板参数列表(模板实参)&#xff0c;如果模板参数列表中有多个参数使用逗号隔开。 2.<>里面至少要有一个…

kotlin将对象转换为map_Kotlin 集合框架:常用集合工具函数(Map 部分)

kotlin.collections.Maps.kt 文件定义了许多针对 Map 接口的工具函数&#xff0c;其中大多数是涉及函数式编程的高阶函数&#xff0c;我们在这里先不讲&#xff0c;等到集合框架结束后进入高阶函数时再讲。今天只讲几个简单的函数。Pair 类和 to() 函数Map 接口表示一种“键 -&…

Oracle/MySQL/Java数据类型对应表

文章目录数据类型对照表MySQL 的 int、bigint、mediumint、smallint、tinyint 的对比关于 MySQL 整型显示位数的问题关于 MySQL 的 timestamp关于 JDBC 类型数据类型对照表 MysqlOracleJavaBIGINTNUMBER(19,0)java.lang.LongBITRAWbyte[]BLOBBLOB RAWbyte[]CHARCHARjava.lang.…

java10个基础错误_我们处理了10亿个Java记录的错误-这是导致97%的错误的原因

java10个基础错误97&#xff05;的记录错误是由10个唯一错误引起的 在2016年&#xff0c;一件事在30年内没有改变。 开发和运营团队仍依靠日志文件对应用程序问题进行故障排除。 由于某些未知原因&#xff0c;我们隐式信任日志文件&#xff0c;因为我们认为事实隐藏在其中。 如…

MySQL的索引学习

文章目录索引自动创建索引手动创建索引删除索引使用索引单列索引PRIMARYNORMALUNIQUEFULLTEXT组合索引&#xff08;复合索引/联合索引&#xff09;索引不足之处索引使用注意事项索引方式 Hash 和 BTree 比较删除索引索引 数据库的索引就像一本书的目录&#xff0c;能够加快数据…

aptx与ldac音质区别_蓝牙协议LDAC和aptx的区别?

LDAC技术的功能介绍LDAC是索尼研发的一种无线音频编码技术&#xff0c;它最早在2015年的CES消费电子设备大展上亮相。在当时&#xff0c;索尼表示比起标准的蓝牙编码、压缩系统&#xff0c;LDAC技术要高效三倍之多。这样一来&#xff0c;那些高解析度的音频文件在进行无线传输的…