【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.mzph.cn/news/148065.shtml

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

相关文章

Hive默认分割符、存储格式与数据压缩

目录 1、Hive默认分割符2、Hive存储格式3、Hive数据压缩 1、Hive默认分割符 Hive创建表时指定的行受限&#xff08;ROW FORMAT&#xff09;配置标准HQL为&#xff1a; ... ROW FORMAT DELIMITED FIELDS TERMINATED BY \u0001 COLLECTION ITEMS TERMINATED BY , MAP KEYS TERMI…

pythongui实时闹钟

# codinggbk import tkinter as tk from time import strftime# 创建一个主窗口 root tk.Tk() root.title("实时闹钟")# 设置窗口的大小不可变 root.resizable(False, False)# 设置窗口始终保持在最上层 root.attributes(-topmost, True)# 更新时间的函数 def time(…

java游戏制作-拼图游戏

一.制作主界面 首先创建一个Java项目命名为puzzlegame。 再在src中创建一个包&#xff0c;用来制作主界面 代码&#xff1a; 结果&#xff1a; 二.设置界面 代码&#xff1a; 三.初始化界面 代码&#xff1a; 优 化代码&#xff1a; 结果&#xff1a; 四.添加图片 先在Java项…

mysql查询json字符串内容

参考文章&#xff1a;mysql json 基础查询_mysql json查询-CSDN博客 mysql查询json字符串内容 &#xff08;多层数组嵌套&#xff09; select id,nameJSON_EXTRACT(JSON_UNQUOTE(JSON_EXTRACT(JSON_UNQUOTE(config_json), $.baseInfo)), $.template_list[*].sms_content) s…

Golang Context 的使用指南

Golang Context 的使用指南 1. 什么是 Context 在 Golang 中&#xff0c;Context 是一个用于跨 goroutine 传递数据、取消任务以及超时控制的标准库。它提供了一种从父 goroutine 向子 goroutine 传递请求或控制信息的机制&#xff0c;可以有效地管理和控制 goroutine 的生命…

kafka入门(一):kafka消息发送与消费

kafka的基础概念 Producer (消息生产者) 向主题发布消息的客户端应用程序称为生产者(Producer)&#xff0c;生产者用于持续不断的向某个主题发送消息。 Consumer (消息消费者) 订阅主题消息的客户端程序称为消费者(Consumer)&#xff0c;消费者用于处理生产者产生的消息。 Co…

03 前后端数据交互【小白入门SpringBoot + Vue3】

项目笔记&#xff0c;教学视频来源于B站青戈 https://www.bilibili.com/video/BV1H14y1S7YV 前两个笔记。是把前端页面大致做出来&#xff0c;接下来&#xff0c;把后端项目搞一下。 后端项目&#xff0c;使用IDEA软件、jdk1.8、springboot2.x 。基本上用的是稳定版。 还有My…

【C++】chono库:使用及源码分析

文章目录 0. 概述1. duration1.1 分析std::chrono::duration_cast() 1.2 使用案例std::chrono::duration::count() 1.3 部分源码 2. time_point2.1 分析std::chrono::time_point_cast() 2.2 使用举例std::chrono::time_point::time_since_epoch() 2.3 部分源码 0. 概述 本篇文…

python使用selenium webDriver时 报错

可能原因和解决&#xff1a; 1. python 解释器 ----> 设置 2. 浏览器版本 与 浏览器驱动版本不一致 ----> 安装同一版本的 (下载chromedriver | 谷歌驱动更高版本的测试版) 参考&#xff1a;Python使用Selenium WebDriver的入门介绍及安装教程-CSDN博客 Selenium安…

设计模式-行为型模式-策略模式

一、什么是策略模式 策略模式是一种行为设计模式&#xff0c;它允许在运行时选择算法或行为&#xff0c;并将其封装成独立的对象&#xff0c;使得这些算法或行为可以相互替换&#xff0c;而不影响使用它们的客户端。&#xff08;ChatGPT生成&#xff09; 主要组成部分&#xff…

基于django的在线教育系统

基于python的在线教育系统 摘要 基于Django的在线教育系统是一种利用Django框架开发的现代化教育平台。该系统旨在提供高效、灵活、易用的在线学习体验&#xff0c;满足学生、教师和管理员的需求。系统包括学生管理、课程管理、教师管理、视频课程、在线测验等核心功能。系统采…

docker 部署Redis集群(三主三从,以及扩容、缩容)

1&#xff1a;创建6个redis容器 docker run -d --name redis01 --net host --privilegedtrue -v /opt/redis/redis01:/data redis:6.0.8 --cluster-enabled yes --appendonly yes --port 6381 docker run -d --name redis02 --net host --privilegedtrue -v /opt/redis/redis0…

在线 sha1 加密

ttmd5 http://www.ttmd5.com/hash.php?type5 qqxiuzi https://www.qqxiuzi.cn/bianma/sha-1.htm jb51 http://tools.jb51.net/password/sha_encode

Kubernetes实战(五)-pod之间网络请求实战

1 同namespace内pod网络请求 1.1 创建namespace ygq $ kubectl create namespace ygq namespace/ygq created 1.2 创建svc和deployment 在naemspace ygq下创建两个应用&#xff1a;nginx和nginx-test。 1.2.1 部署应用nginx $ cat nginx-svc.yaml apiVersion: v1 kind: …

立哥国家示范项目-5G智慧文旅

项目总体技术方案&#xff1a; 1、旅游5G专网建设&#xff1a;是基于公网授权频谱&#xff0c;采用专线形式&#xff0c;使用MEC服务器为用户提供服务,边缘计算使用Edge VLAVR支持多类型应用&#xff0c;并通过编排实现边缘业务的构建。解决了信号密度覆盖小、强度弱的问题。 …

代码随想录二刷 | 数组 | 总结篇

代码随想录二刷 &#xff5c; 数组 &#xff5c; 总结篇 基础知识二分查找移除元素有序数组的平方长度最小的数组最小覆盖子串螺旋数组 基础知识 定义&#xff1a;数组是存放在连续内存空间上的相同类型数据的集合 特点&#xff1a; 数组下标从 0 开始数组内存空间的地址是连…

Golang Context 的并发安全性探究

在 Golang 中&#xff0c;Context 是一个用于管理 goroutine 生命周期、传递请求和控制信息的重要机制。然而&#xff0c;当多个 goroutine 同时使用 Context 时&#xff0c;很容易出现并发安全性问题。本文将探讨如何正确使用 Context 并保证其在并发环境下的安全性。 1. Con…

23111707[含文档+PPT+源码等]计算机毕业设计基于javawebmysql的旅游网址前后台-全新项目

文章目录 **软件开发环境及开发工具&#xff1a;****功能介绍&#xff1a;****论文截图&#xff1a;****实现&#xff1a;****代码:** 编程技术交流、源码分享、模板分享、网课教程 &#x1f427;裙&#xff1a;776871563 软件开发环境及开发工具&#xff1a; 前端使用技术&a…

mock测试数据

1.下载一个jar 架包 地址&#xff1a;链接&#xff1a;https://pan.baidu.com/s/1G5rVF5LlIYpyU-_KHsGjOA?pwdab12 提取码&#xff1a;ab12 2.配置当前电脑java环境变量 3.在同一文件目录下创建json 数据4.在终端切换到当前目录下启动服务&#xff0c; java -jar ./moco-r…

力扣:171. Excel 表列序号(Python3)

题目&#xff1a; 给你一个字符串 columnTitle &#xff0c;表示 Excel 表格中的列名称。返回 该列名称对应的列序号 。 例如&#xff1a; A -> 1 B -> 2 C -> 3 ... Z -> 26 AA -> 27 AB -> 28 ... 来源&#xff1a;力扣&#xff08;LeetCode&#xff09; …