condition_variable---C++条件变量

news2024/10/6 7:01:05

文章目录

  • 1.C++11条件变量
  • 2. 相关api方法
    • 2.1 wait方法
  • 2.2 wait_for 方法
    • 2.3 wait_until 方法
    • 2.4 notify_one 和 notify_all 方法
  • 3虚假唤醒等问题

1.C++11条件变量

 std::condition_variable 是 C++11 标准库中提供的一个类,用于在多线程环境中实现线程间的同步和通信。通常与 std::mutex(互斥锁)一起使用,以实现线程的等待和唤醒机制。

2. 相关api方法

2.1 wait方法

 wait 方法用于阻塞当前线程,直到另一个线程调用同一 condition_variable 对象的 notify_one() 或 notify_all() 方法来唤醒等待的线程。wait 方法有两种形式:
第一种

void wait(std::unique_lockstd::mutex& lock);

当前线程的执行会被阻塞,直到收到 notify 为止。在等待过程中,会自动释放与 lock 关联的互斥锁,以允许其他线程访问共享资源。当线程被唤醒后,它会自动重新获取互斥锁,然后继续执行。
第二种

template< class Predicate>
void wait(std::unique_lockstd::mutex&
lock, Predicate pred);

这是一个带谓词的版本,线程仅在 pred 返回 false 时被阻塞。如果 pred 返回 true,则线程不会被阻塞,并继续执行。这有助于避免虚假唤醒,因为线程在唤醒后会重新检查条件是否满足。

2.2 wait_for 方法

wait_for 方法用于阻塞当前线程,直到另一个线程调用 notify 方法唤醒它,或者直到指定的超时时间到达。它也有两种形式:

第一种

template<class Rep, class Period> cv_status
wait_for(std::unique_lockstd::mutex& lock, const
std::chrono::duration<Rep, Period>& rel_time);

在指定的相对时间 rel_time 内,线程被阻塞。如果在这段时间内线程被唤醒,则返回 cv_status::no_timeout;如果超时,则返回 cv_status::timeout。

第二种

template<class Rep, class Period, class Predicate> bool
wait_for(std::unique_lockstd::mutex& lock, const
std::chrono::duration<Rep, Period>& rel_time, Predicate pred);

与第一种形式类似,但增加了谓词 pred。线程仅在 pred 返回 false 时被阻塞,并且如果在超时前 pred 变为 true 或线程被唤醒,则返回 true;如果超时且 pred 仍为 false,则返回 false。

2.3 wait_until 方法

 wait_until 方法用于阻塞当前线程,直到另一个线程调用 notify 方法唤醒它,或者直到指定的绝对时间点到达。它同样有两种形式:

template<class Clock, class Duration> cv_status
wait_until(std::unique_lockstd::mutex& lock, const
std::chrono::time_point<Clock, Duration>& abs_time);

在指定的绝对时间点 abs_time 之前,线程被阻塞。如果在这段时间内线程被唤醒,则返回 cv_status::no_timeout;如果到达指定时间点仍未被唤醒,则返回 cv_status::timeout。

template<class Clock, class Duration, class Predicate> bool
wait_until(std::unique_lockstd::mutex& lock, const
std::chrono::time_point<Clock, Duration>& abs_time, Predicate pred);

与第一种形式类似,但增加了谓词 pred。线程在 pred 返回 false 且未到达 abs_time 时被阻塞。如果在这段时间内 pred 变为 true 或线程被唤醒,则返回 true;如果到达 abs_time 且 pred 仍为 false,则返回 false。

2.4 notify_one 和 notify_all 方法

void notify_one() noexcept;

唤醒等待在 condition_variable 对象上的单个线程。如果有多个线程在等待,则唤醒哪一个是不确定的。

void notify_all() noexcept;

唤醒等待在 condition_variable 对象上的所有线程。

3虚假唤醒等问题

1.std::condition_variable 必须与 std::unique_lock 一起使用,以确保在等待条件时以互斥方式访问共享资源。
2.虚假唤醒(spurious wakeup)是多线程环境中的一种正常行为,因此在使用 wait、wait_for 和 wait_until 方法时,应该总是重新检查条件是否满足,即使用while循环检查

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

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

相关文章

【数据结构与算法】快速排序霍尔版

&#x1f493; 博客主页&#xff1a;倔强的石头的CSDN主页 &#x1f4dd;Gitee主页&#xff1a;倔强的石头的gitee主页 ⏩ 文章专栏&#xff1a;《数据结构与算法》 期待您的关注 ​

找不到x3daudio1_7.dll怎么修复?一招搞定x3daudio1_7.dll丢失问题

当你的电脑突然弹出提示&#xff0c;“找不到x3daudio1_7.dll”&#xff0c;这时候你就需要警惕了。这往往意味着你的电脑中的程序出现了问题&#xff0c;你可能会发现自己无法打开程序&#xff0c;或者即便打开了程序也无法正常使用。因此&#xff0c;接下来我们要一起学习一下…

【简单介绍下Memcached】

&#x1f308;个人主页: 程序员不想敲代码啊 &#x1f3c6;CSDN优质创作者&#xff0c;CSDN实力新星&#xff0c;CSDN博客专家 &#x1f44d;点赞⭐评论⭐收藏 &#x1f91d;希望本文对您有所裨益&#xff0c;如有不足之处&#xff0c;欢迎在评论区提出指正&#xff0c;让我们共…

LabVIEW从测试曲线中提取特征值

在LabVIEW中开发用于从测试曲线中提取特征值的功能时&#xff0c;可以考虑以下几点&#xff1a; 数据采集与处理&#xff1a; 确保你能够有效地采集和处理测试曲线数据。这可能涉及使用DAQ模块或其他数据采集设备来获取曲线数据&#xff0c;并在LabVIEW中进行处理和分析。 特…

Wormhole Filters: Caching Your Hash on Persistent Memory——泛读笔记

EuroSys 2024 Paper 论文阅读笔记整理 问题 近似成员关系查询&#xff08;AMQ&#xff09;数据结构可以高效地近似确定元素是否在集合中&#xff0c;例如Bloom滤波器[10]、cuckoo滤波器[23]、quotient滤波器[8]及其变体。但AMQ数据结构的内存消耗随着数据规模的增长而快速增长…

Kubernetes集群性能测试之kubemark集群搭建

Kubernetes集群性能测试之kubemark集群搭建 Kubemark是K8s官方提供的一个对K8s集群进行性能测试的工具。它可以模拟出一个K8s cluster&#xff08;Kubemark cluster&#xff09;&#xff0c;不受资源限制&#xff0c;从而能够测试的集群规模比真实集群大的多。这个cluster中ma…

针对tcp不出网打——HTTP隧道代理(以CFS演示)

目录 上传工具到攻击机 使用说明 生成后门文件 由于电脑短路无法拖动文件&#xff0c;我就wget发送到目标主机tunnel.php文件​ 成功上传​ 可以访问上传的文件 启动代理监听 成功带出 后台私信获取弹药库工具reGeorg 上传工具到攻击机 使用说明 生成后门文件 pyt…

Android OpenGL ES 离屏幕渲染2——获取渲染结果并显示到ImageView控件中,使用最简模型展示

简介&#xff1a; 紧接上文&#xff0c;本文将用一个不包含顶点shader和片元shader的最小模型讲述如何把通过EGL创建的OpenGL ES环境渲染后的结果进行提取&#xff0c;单纯输出一片铺满视口的红色的像素。 EGL环境创建逻辑&#xff1a; 先看完整代码&#xff1a; package com.c…

异常组成、作用、处理方式(3种)、异常方法、自定义异常

目录 异常的组成&#xff1a;运行异常与编译异常 两者区别&#xff1a;编译异常用来提醒程序员&#xff0c;运行异常大部分是由于参数传递错误导致 异常作用&#xff1a; 作用1&#xff1a;就是平时的报错&#xff0c;方便我们找到报错的来源 作用2&#xff1a;在方法内部…

华为机试HJ51输出单向链表中倒数第k个结点

华为机试HJ51输出单向链表中倒数第k个结点 题目&#xff1a; 想法&#xff1a; 因为要用链表&#xff0c;且要找到倒数第k个结点&#xff0c;针对输入序列倒叙进行构建链表并找到对应的元素输出。注意因为有多个输入&#xff0c;要能接受多次调用 class Node(object):def __…

[Godot3.3.3] – 人物死亡动画 part-2

前言 在上一个 part 中已经完成了大部分的逻辑&#xff0c;现在进行一些新的修改。 增加重力 首先将 PlayerDeath 中的 AnimationPlayer 设置为自动播放。 返回 PlayerDeath.gd 并增加一个重力 300&#xff0c;防止玩家的尸体腾空运动。 var gravity 1000 _process 函数中…

某大会的影响力正在扩大,吞噬了整个数据库世界!

1.规模空前 你是否曾被那句“上有天堂&#xff0c;下有苏杭”所打动&#xff0c;对杭州的湖光山色心驰神往&#xff1f;7月&#xff0c;正是夏意正浓的时节&#xff0c;也是游览杭州的最佳时期。这座古典与现代交融的城市将迎来了第13届PostgreSQL中国技术大会。作为全球数据库…

基于深度学习LightWeight的人体姿态之行为识别系统源码

一. LightWeight概述 light weight openpose是openpose的简化版本&#xff0c;使用了openpose的大体流程。 Light weight openpose和openpose的区别是&#xff1a; a 前者使用的是Mobilenet V1&#xff08;到conv5_5&#xff09;&#xff0c;后者使用的是Vgg19&#xff08;前10…

二、Spring

二、Spring 1、Spring简介 1.1、Spring概述 官网地址&#xff1a;https://spring.io/ Spring 是最受欢迎的企业级 Java 应用程序开发框架&#xff0c;数以百万的来自世界各地的开发人员使用 Spring 框架来创建性能好、易于测试、可重用的代码。 Spring 框架是一个开源的 Jav…

Nginx七层(应用层)反向代理:HTTP反向代理proxy_pass篇

Nginx七层&#xff08;应用层&#xff09;反向代理 HTTP反向代理proxy_pass篇 - 文章信息 - Author: 李俊才 (jcLee95) Visit me at CSDN: https://jclee95.blog.csdn.netMy WebSite&#xff1a;http://thispage.tech/Email: 291148484163.com. Shenzhen ChinaAddress of thi…

MySQL Binlog详解:提升数据库可靠性的核心技术

文章目录 1. 引言1.1 什么是MySQL Bin Log&#xff1f;1.2 Bin Log的作用和应用场景 2. Bin Log的基本概念2.1 Bin Log的工作原理2.2 Bin Log的三种格式 3. 配置与管理Bin Log3.1 启用Bin Log3.2 配置Bin Log参数3.3 管理Bin Log文件3.4 查看Bin Log内容3.5 使用mysqlbinlog工具…

论文研读|AI生成图像检测发展历程及研究现状

前言&#xff1a;本篇博客系统性梳理AI生成图像检测的研究工作。 「人工智能生成图像检测」研究及发展现状介绍 参考资料 https://fdmas.github.io/AIGCDetect/针对AIGC检测的鲁棒性测试——常见攻击手段汇总论文研读&#xff5c;以真实图像为参考依据的AIGC检测论文研读&…

C++ 函数高级——函数重载——注意事项

1.引用作为重载条件 2.函数重载碰到函数默认参数 示例&#xff1a; 运行结果&#xff1a;

HTTP长连接

长连接优点 HTTP为什么要开启长连接呢? 主要是为了节省建立的时间,请求可以复用同一条TCP链路,不用重复进行三握+四挥 如果没有长连接,每次请求都做三握+四挥 如果有长链接,在一个 TCP 连接中可以持续发送多份数据而不会断开连接,即请求可以复用TCP链路 长连接缺点 …

国内免费Ai最新体验+评分

我们主要从画图、数据分析、语言三个方面进行简单测评 1.智谱AI - ChatGLM 智谱产品&#xff1a; 智谱清言 CodeGeeX–智能编程助手——放在这里给大家推荐一手 AMiner 学术论文检索平台 测试1-画图测试 ⭐⭐⭐⭐ 画一头猪 测试2-数据分析 ⭐⭐⭐⭐ 画图和线性回归模型…