【C++】多线程的学习笔记(3)——白话文版(bushi

目录

前一篇内容(mutex锁)

前言

Condition Variable的简介

Condition Variable的使用方法

wait方法

wait for函数与wait until函数

notify函数

notify_one

notify_all

注意


前一篇内容(mutex锁)

【C++】多线程的学习笔记(2)——白话文版(bushi-CSDN博客文章浏览阅读161次。lock_guard是模板类,对比于mutex的区别是lock_guard在创建时会尝试获得锁的所有权(注意时尝试,如果获取不到就相当于没有用,并且不会报错),在作用域结束时会自动析构,无需手动解锁该类不可中途上锁和解锁,不可复制unique_lock的用法和lock_guard的用法类似,主要的区别在于他可以中途上锁以及解锁对比于lock_guard会更加的灵活但是所需要的内存空间会更大同时它的也有adopt_lock参数用法一样,而且他还拥有其他的第二参数。https://blog.csdn.net/mumuemhaha/article/details/133554220?spm=1001.2014.3001.5501

前言

好久没有继续写博客了,原因就是去沉淀了一下偷懒了一下

现在在学网络编程,c++的多线程也还在学

这一变博客就讲讲c++中的Condition Variable库吧

Condition Variable的简介

官方原文解释

翻译就是

条件变量是一个对象,它能够阻止调用线程,直到通知恢复。

当调用线程的一个等待函数时,它使用 (mutex ) 来锁定线程。该线程将保持阻塞状态,直到被另一个线程唤醒,该线程对同一对象调用通知函数

这里我们可以看到Condition Variable一般是要和mute锁配合使用来发挥他的最大用处

Condition Variable的使用方法

wait方法

wait方法的原型为两种

void wait (unique_lock<mutex>& lck);
template <class Predicate>
void wait (unique_lock<mutex>& lck, Predicate pred);

第一种为他只是传递一个mutex锁(注意是unique_lock锁)来锁定自己,也就是堵塞当前的线程,直到自己被notify(下面要讲到的函数)唤醒。

第二种和第一种差不多不过他多了一个predicate的参数,这里可以是一个函数,类型为true或者false,我画了一张并不是很准确的图片可以帮助理解一下

大部分时候为了缩短代码的长度他一般会写出lambda表达式,也就是类似与[x] () { x=1; };这样的表达式

它可以等效为

bool F_1(int x){return x=1
}

其中的lambda表达式有许多用法——诸如捕获前面的变量,传递以及引用;这里不多做赘述,论坛里有许多相关的文章,这里提一嘴主要是让读者知道这是一个什么东西,好搜索相应的教程。

wait for函数与wait until函数

wait for函数原型

template <class Clock, class Duration>cv_status wait_until (unique_lock<mutex>& lck,const chrono::time_point<Clock,Duration>& abs_time);
template <class Clock, class Duration, class Predicate>bool wait_until (unique_lock<mutex>& lck,const chrono::time_point<Clock,Duration>& abs_time,Predicate pred);

这里不用仔细看,大部分和前面的wait函数一样,也是有两个函数(一个带predicate的参数,一个不带predicate的参数),但是多了一个设定超时时间,也就是超过时间即使没有获取到mutex锁就不堵塞当前线程了。

第二个参数可以设定一个超时时间比如2秒。

而wait until函数为

template< class Clock, class Duration >
std::cv_statuswait_until( std::unique_lock<std::mutex>& lock,const std::chrono::time_point<Clock, Duration>& timeout_time );template< class Clock, class Duration, class Pred >
bool wait_until( std::unique_lock<std::mutex>& lock,const std::chrono::time_point<Clock, Duration>& timeout_time,Pred pred );

区别与wait until的是wait_until是取一个时间点

notify函数

notify函数分为notify_one以及notify_all

notify_one

notify_one为随机唤醒一个被阻塞的线程(注意为随机)

notify_all

notify_all为唤醒所有的被阻塞的线程

注意

需要注意的是notify唤醒后如果线程被唤醒后依然不满足继续执行下去的条件那么线程又会被重新堵塞。

小结

本章主要简单讲解了Condition Variable的用法以及途径他是一种可以让项目异步执行的一个操作,使得程序有一个很好得到性能。

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

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

相关文章

保姆级前端翻牌效果(CSS)

效果 翻牌效果 hover 时候 代码直接上 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>Document<…

android适配鸿蒙系统开发

将一个Android应用迁移到鸿蒙系统需要进行细致的工作&#xff0c;因为两者之间存在一些根本性的差异&#xff0c;涉及到代码、架构、界面等多个方面的修改和适配。以下是迁移工作可能涉及的一些主要方面&#xff0c;希望对大家有所帮助。北京木奇移动技术有限公司&#xff0c;专…

在QGIS中加载显示3DTiles数据

“我们最近有机会在QGIS 3.34中实现一个非常令人兴奋的功能–能够以“Cesium 3D Tiles”格式加载和查看3D内容&#xff01;” ——QGIS官方的 宣传介绍。 体验一下&#xff0c;感觉就是如芒刺背、如坐针毡、如鲠在喉。 除非我电脑硬件有问题&#xff0c;要么QGIS的3Dtiles是真…

企业邮箱认证指南:安全与高效的邮箱认证方法

企业邮箱是专门为企业提供的电子邮件服务&#xff0c;安全性和专业性更高。在开始使用企业邮箱之前&#xff0c;很多人会有一些问题&#xff0c;比如企业邮箱需要认证吗、如何开通企业邮箱&#xff0c;以及哪款企业邮箱好。 1、企业邮箱在使用前需要认证吗&#xff1f; 答案是肯…

【机器学习8】采样

1 均匀分布随机数 均匀分布是指整个样本空间中的每一个样本点对应的概率&#xff08;密度&#xff09; 都是相等的。 根据样本空间是否连续&#xff0c; 又分为离散均匀分布和连续均匀分布。编程实现均匀分布随机数生成器一般可采用线性同余法&#xff08;Linear Congruential…

二维码智慧门牌管理系统升级解决方案:门牌聚合,让管理更便捷!

文章目录 前言一、传统门牌管理系统的瓶颈二、地图门牌聚合展示的优势三、地图门牌聚合展示的实现方法四、智慧门牌管理系统的未来发展 前言 随着城市的发展和建设&#xff0c;对于地址信息的管理变得越来越重要。而智慧门牌管理系统作为管理地址信息的重要工具&#xff0c;其…

原来机械硬盘比内存慢10万倍

我们都知道机械硬盘的速度很慢&#xff0c;内存的速度很快&#xff0c;那么不同存储器之间的差距到底有多大呢&#xff1f; 我们先来看一幅图&#xff1a; CPU访问寄存器的时间是0.3纳秒&#xff0c;访问L1高速缓存的时间是1纳秒&#xff0c;访问L2高速缓存的时间是4纳秒… 秒…

设计模式-状态模式-笔记

状态模式State 在组件构建过程中&#xff0c;某些对象的状态经常面临变化&#xff0c;如何对这些变化进行有效的管理&#xff1f;同时又维持高层模块的稳定&#xff1f;“状态变化”模式为这一问题提供了一种解决方案。 经典模式&#xff1a;State、Memento 动机&#xff08…

基于RFbeam的V-LD1-60GHz毫米波雷达传感器数据获取(通过UART串口来控制模块)

基于RFbeam的V-LD1-60GHz毫米波雷达传感器数据获取&#xff08;通过UART串口来控制模块&#xff09; 工程&#xff1a; Keil工程资源 文章目录 V-LD1命令发送消息回复通信示例雷达数据获取宏定义通信代码运行效果附录&#xff1a;压缩字符串、大小端格式转换压缩字符串浮点数压…

Selenium自动化测试框架

一.Selenium概述 1.1 什么是框架? 框架&#xff08;framework&#xff09;是一个框子——指其约束性&#xff0c;也是一个架子——指其支撑性。是一个基本概念上的 结构用于去解决或者处理复杂的问题。 框架是整个或部分系统的可重用设计&#xff0c;表现为一组抽象构件及…

ARDUINO UNO 12颗LED超酷流水灯效果

效果代码&#xff1a; #define t 30 #define t1 20 #define t2 100 #define t3 50 void setup() { // set up pins 2 to 13 as outputs for (int i 2; i < 13; i) { pinMode(i, OUTPUT); } } /Effect 1 void loop() { effect_1(); effect_1(); effect_…

目标检测—YOLO系列(二 ) 全面解读复现YOLOv1 PyTorch

精读论文 前言 从这篇开始&#xff0c;我们将进入YOLO的学习。YOLO是目前比较流行的目标检测算法&#xff0c;速度快且结构简单&#xff0c;其他的目标检测算法如RCNN系列&#xff0c;以后有时间的话再介绍。 本文主要介绍的是YOLOV1&#xff0c;这是由以Joseph Redmon为首的…

Kafka 集群实现数据同步

Kafka 介绍 Kafka 是一个高吞吐的分布式消息系统&#xff0c;不但像传统消息队列&#xff08;RaabitMQ、RocketMQ等&#xff09;那样能够【异步处理、流量消峰、服务解耦】 还能够把消息持久化到磁盘上&#xff0c;用于批量消费。除此之外由于 Kafka 被设计成分布式系统&…

spring学习笔记-IOC,AOP,事务管理

目录 概述 什么是spring 侵入式的概念 spring的核心 spring的优势 注意 IOC控制反转 概述 核心 容器 DI&#xff0c;dependency injection依赖注入 概念 注入方式 循环依赖 spring如何解决循环依赖 spring生成Bean的方式 Bean属性注入&#xff08;Bean属性赋值…

Confluence 快速安装教程

安装jdk yum install -y java-1.8.0-openjdk.x86_64 java -version 安装MySQL mkdir -p /data/mysql/data chmod 777 /data/mysql/datadocker rm -f mysql docker run -d --name mysql \-p 3306:3306 \-e MYSQL_ROOT_PASSWORDfingard1 \-v /data/mysql/data:/var/lib/mysql …

Spring学习③__Bean管理

目录 IOC接口ApplicationContext 详解IOC操作Bean管理基于xml方式基于xml方式创建对象基于xml方式注入属性使用set方法进行注入通过有参数的构造进行注入p 名称空间注入&#xff08;了解&#xff09; 基于xml方式注入其他类型属性xml 注入数组类型属性 IOC接口 IOC思想基于IOC…

CSS特效013:背景色彩不停流动效果

CSS常用示例100专栏目录 本专栏记录的是经常使用的CSS示例与技巧&#xff0c;主要包含CSS布局&#xff0c;CSS特效&#xff0c;CSS花边信息三部分内容。其中CSS布局主要是列出一些常用的CSS布局信息点&#xff0c;CSS特效主要是一些动画示例&#xff0c;CSS花边是描述了一些CSS…

CTF-PWN-tips

文章目录 overflowscanfgetreadstrcpystrcat Find string in gdbgdbgdb peda Binary ServiceFind specific function offset in libc手工自动 Find /bin/sh or sh in library手动自动 Leak stack addressFork problem in gdbSecret of a mysterious section - .tlsPredictable …

Android Fragment 要你何用?2.0版本

作者&#xff1a;小鱼人爱编程 1. 老生常谈&#xff1a;为什么需要Fragment? 先看Activity、Fragment、View三者的关系&#xff1a; Activity 拥有生命周期&#xff0c;但是需要和AMS通信(跨进程)&#xff0c;比较臃肿。 View 不需要和AMS通信&#xff0c;但没有生命周期&…

JavaEE——简单认识HTML

文章目录 一、简单解释 HTML二、认识 HTML 的结构三、了解HTML中的相关标签1.注释标签2.标题标签3.段落标签 p4. 换行标签 br5.格式化标签6.图片标签解释 src解释 alt解释其他有关 img 标签的属性 7.超链接标签 a8.表格标签9.列表标签10.input 标签11. select 下拉菜单以及 div…