条件变量(Condition Variable)详解

C++11并发编程-条件变量(condition_variable)详解 <condition_variable >头文件主要包含了与条件变量相关的类和函数。相关的类包括 std::condition_variable和 std::condition_variable_any,还有枚举类型std::cv_status。另外还包括函数 std::notify_all_at_thread_exit(),下面分别介绍一下以上几种类型。std::condition_variabl 阅读详情

http://www.wuzesheng.com/?p=1668

条件变量(Condtion Variable)是在多线程程序中用来实现“等待->唤醒”逻辑常用的方法。举个简单的例子,应用程序A中包含两个线程t1和t2。t1需要在 bool变量test_cond为true时才能继续执行,而test_cond的值是由t2来改变的,这种情况下,如何来写程序呢?可供选择的方案有两 种:

  • 第一种是t1定时的去轮询变量test_cond,如果test_cond为false,则继续休眠;如果test_cond为true,则开始执行。
  • 第二种就是上面提到的条件变量,t1在test_cond为false时调用cond_wait进行等待,t2在改变test_cond的值后,调用cond_signal,唤醒在等待中的t1,告诉t1 test_cond的值变了,这样t1便可继续往下执行。

很明显,上面两种方案中,第二种方案是比较优的。在第一种方案中,在每次轮询时,如果t1休眠的时间比较短,会导致cpu浪费很厉害;如果t1休眠的时间 比较长,又会导致应用逻辑处理不够及时,致使应用程序性能下降。第二种方案就是为了解决轮询的弊端而生的。然而条件变量在使用的过程中,比较容易出错,如 何用得不正确的话,会适得其反的,接下来,我将详细分析如何来使用条件变量,希望能够给在使用条件变量过程中遇到问题的朋友有所帮助。
在开始介绍之前,需要说明一下,在接下来的介绍中,需要用到互斥锁和条件变量相关的内容,在这里我以linux下的pthread_mutex_t为互斥 锁类型,pthread_cond_t为条件变量类型来进行介绍,对pthread不熟的朋友,可以参考一下linux下的manual。
1. 下面是把刚开始举的例子翻译后的程序:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
pthread_mutex_t mutex;  ///< 互斥锁
pthread_cond_t  cond;   ///< 条件变量
bool test_cond = false;
/// TODO 初始化mutex和cond
 
/// thread 1:
pthread_mutex_lock(&mutex);            ///< 1
while (!test_cond)
{
    pthread_cond_wait(&cond, &mutex);  ///< 2,3
}
pthread_mutex_unlock(&mutex);          ///< 4
RunThread1Func();
 
/// thread 2:
pthread_mutex_lock(&mutex);            ///< 5
test_cond = true;
pthread_cond_signal(&cond);
pthread_mutex_unlock(&mutex);          ///< 6
 
/// TODO 销毁mutex和cond

通过上面的例子,下面我来介绍一下条件变量在使用过程中需要注意的几点(也是比较容易出错的):
(1)条件变量的使用过程中,最为关键的一点是互斥锁的使用。细心的朋友应该发现了,我在上面的例子中标了1、2、3、4、5、6个标号。在这里1、4、 5、6都是正常的lock/unlock,2、3是需要特别说明的。2是进入pthread_cond_wait后 的,pthread_cond_wait调的pthread_mutex_unlock,这样做的目的是为了保证在thread1阻塞wait 后,thread2获取同一把锁mutex的时候,能够正常获取(即5,6)。3是thread1被唤醒后,要退出pthead_cond_wait之 前,pthread_cond_wait调的pthread_mutex_lock,这样做的目的是为了把mutex的控制权还给调用 pthread_cond_wait的线程(即thread1)。整理一下基本的时序为:

1
2
3
thread 1 lock->thread 1 wait-> thread 1 unlock(in wait)
->thread 2 lock->thread 2 signal->thread 2 unlock
->thread 1 lock(in wait)->thread 1 unlock

(2)条件变量使用的过程中,通常会加一个bool或者int的值test_cond来配合使用。这里需要注意的一点是一定要在signal之前来 改变test_cond,这样才能保证wait的线程被唤醒后,能够取到正确的test_cond的值,否则后果是不可预测的。

boost---condition_variable条件变量使用详解 1、条件变量是一种用于等待的同步机制,可以实现线程间通信,它必须与互斥量配合使用。 2、boost::thread提供的两种条件变量对象:(1)、condition_variable;(2)、condition_variable_any。他们的区别是:(1)、condition_variable只能配合boost::mutex互斥量;(2)、condition_variable_any可以适应更... 阅读详情

相关推荐

Qt+OpenGL+Cesium三件套:打造高性能3D GIS桌面应用的5个关键点

本文深入探讨了如何利用Qt、OpenGL和Cesium数据规范构建高性能桌面级3D GIS应用。文章聚焦于五个关键点:架构选型、OpenGL渲染优化、3D Tiles数据解析与调度、内存与多线程管理,以及高级特性实现,旨在帮助开发者在C++生态中打造不依赖网络、运算能力更强的重型3D地理信息客户端。

weixin_28197941的博客 380

[转] 条件变量(Condition Variable)详解

http://www.wuzesheng.com/?p=1668 条件变量(Condtion Variable)是在多线程程序中用来实现“等待->唤醒”逻辑常用的方法。举个简单的例子,应用程序A中包含两个线程t1和t2。t1需要在 bool变量test_cond为true时才能继续执行,而test_cond的值是由t2来改变的,这种情况下,如何来写程序呢?可供选择的方案有两 种: ...

weixin_34150503的博客 272

基于FPGA的 SelectIO IP核 的仿真验证-----( LVDS差分高速传输)

SelectIO IP核 的仿真验证

qq_43618170的博客 1万+

C++并发编程(7):条件变量(conditional variable)、wait( )与notify_one( )、spurious wakeups(虚假唤醒)

主要学习介绍C++并行编程的基础知识,做一些学习记录并分享

工大机器人工作室 3264

告别两个电源模块!用UCD3138+四开关Buck-Boost,一个电路搞定电池充放电(附原理图分析)

本文详细介绍了采用UCD3138数字控制器和四开关Buck-Boost拓扑的双向DC/DC变换器设计,实现单一电路完成电池智能充放电管理。该方案显著降低BOM成本和PCB面积,提升系统效率至96.2%,适用于UPS、通信基站和储能系统,具有高效、紧凑和成本优势。

weixin_30256901的博客 395

告别理论纠结!用ADS和Sigrity玩转电源完整性:从PDN阻抗优化到芯片供电仿真全流程

本文详细介绍了如何利用ADS和Sigrity工具进行电源完整性(PI)分析,从PDN阻抗优化到芯片供电仿真的全流程。通过频域、直流和时域分析,工程师可以精确评估电源网络性能,优化设计以避免电压波动和系统失效。文章还提供了ADS和Sigrity PowerDC的实战操作指南,帮助读者掌握现代PI设计的核心技术。

weixin_33749242的博客 310

《探索C++多线程》:condition_variable源码(一)

条件变量是一种多线程的同步机制,它能够阻塞线程,直到某一条件满足。

hujingshuang 6979

ANSYS APDL生死单元实战:焊接模拟从入门到精通(附完整命令流)

本文详细介绍了使用ANSYS APDL进行焊接模拟的核心技术——生死单元法。通过一个完整的平板对接焊案例,从原理剖析、模型搭建、命令流编写到移动热源施加和后处理,手把手指导工程师掌握这一动态仿真方法,有效预测焊接过程中的温度场、残余应力与变形。

k6l7m8n9的博客 150

关于std::thread初始化的一点问题

问题代码 class Message{ public: std::string s; Message(const std::string&s = ""):s(s){} }; class MessageQueue{ std::queue<Message> qu; std::mutex mutex; std::condition_variable condition; size_t cap; public: MessageQueue(

tyxxzjpdez的博客 1649

【DRAM存储器一】基本存储单元、阵列结构、读写原理

详述DRAM存储器存储单元、存储阵列结构和读写原理

highman110的博客 7250

Python与CAD系列基础篇(二)创建点和直线并修改样式

①通过pyautocad连接AutoCAD进行处理②通过ezdxf处理dxf格式文件。创建和编辑点和直线的方法,并演示如何修改它们的样式、颜色和线型。

weixin_43894929的博客 3035

Linux多线程编程- 条件变量(Conditional variable)

在多线程环境中,条件变量提供了一种方式,使得一个线程可以等待某个特定条件成为真,而另一个线程在该条件成为真时可以通知等待线程。

青衫客36的博客 1271

YOLO26跨时代升级!YOLO26 MLCA注意力机制解读

摘要: 本文提出了一种基于多级上下文聚合(MLCA)注意力机制的改进卷积神经网络。MLCA模块通过局部和全局注意力机制动态调整特征图权重,结合了ECA注意力与自适应池化,显著提升特征表达能力。实验表明,添加MLCA后模型mAP提升12.11,准确率提高5.43。文中详细解析了MLCA1模块的工作原理,包括局部/全局池化、卷积操作和注意力加权机制,并介绍了集成MLCA的Bottleneck_MLCA模块。该机制通过多层次特征融合,在保持计算效率的同时增强模型对关键特征的敏感性。最后提供了YOLOv26-MLC

m0_71589036的博客 281

条件变量(condition_variable)详解

头文件主要包含了与条件变量相关的类和函数。相关的类包括std::condition_variable和std::condition_variable_any,还有枚举类型std::cv_status。另外还包括函数std::notify_all_at_thread_exit(),下面分别介绍一下以上几种类型。 std::condition_variable 类介绍 std::condit...

m0_37346206的博客 1758

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

C++11条件变量condition_variable详解

互斥量是多线程间同时访问某一共享变量时,保证变量可被安全访问的手段。但单靠互斥量无法实现线 程的同步。线程同步是指线程间需要按照预定的先后次序顺序进行的行为。C++11对这种行为也提供了 有力的支持,这就是条件变量。条件变量位于头文件condition_variable下。【官方说明文档】。拥有条件变量的线程获取互斥量。循环检查某个条件,如果条件不满足则阻塞直到条件满足;如果条件满足则向下执行。某个线程满足条件执行完之后调用notify_one或notify_all唤醒一个或者所有等待线程。

az44yao的专栏 1167

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

C++11 条件变量(condition_variable) 使用详解

C++11 条件变量(condition_variable) 使用详解

whl0071的专栏 3956

条件变量(condition variable)详解

原理: 假设我们需要解决这样一个问题:一个列表记录需要处理的任务。一个线程往此列表添加任务,一个线程processTask处理此列表中的任务。这个问题的一个关键点在于processTask怎么判断任务列表不为空。一般有两种方法: **一. processTask线程不断查询任务列表是否为空。** **二. 当列表不为空的时候,通知processTask处理相关任务。** 第一种方法往往是在一个

huanggl的专栏 6335

C++11多线程条件变量condition_variable详解

<condition_variable > 头文件主要包含了与条件变量相关的类和函数。相关的类包括 std::condition_variable 和 std::condition_variable_any,还有枚举类型std::cv_status。另外还包括函数 std::notify_all_at_thread_exit(),下面分别介绍一下以上几种类型。 std::condition_variable 类介绍 std::condition_variable 是条件变量,更多有关条...

C/C++、嵌入式开发、深度学习算法、模型部署与推理优化 610

C++11多线程条件变量std::condition_variable详解(转 )

(转 )C++11多线程条件变量std::condition_variable详解 目录 std::condition_variable 类介绍 std::condition_variable 构造函数 std::condition_variable::wait() std::condition_variable::wait_for() std::condition_variable::wait_until() std::condition_variable::notify_one() st

山城盛夏的博客 3万+

C++编程中的条件变量(std::condition_variable)详解

条件变量是C++多线程编程中实现线程间同步与通信的重要工具。通过合理使用条件变量,可以构建出高效、响应迅速的多线程应用程序。然而,正确使用条件变量需要理解其工作原理并注意一些关键细节,如虚假唤醒和锁的管理。希望本文的介绍和示例能帮助读者更好地掌握条件变量的使用方法。

907

C++中的条件变量(condition_variable)详解:小白版

条件变量是一种特殊的变量,它可以让一个线程在某个条件成立之前等待,当条件成立时,这个线程就可以继续执行。条件变量通常和另一种叫做互斥锁(std::mutex)的东西一起使用,互斥锁可以保证在同一时间只有一个线程能访问某个资源。

码事漫谈 1336
上一篇: C++的 RTTI 观念和用途(非常详细)
下一篇: 低优先级任务在执行过程中高优先级任务在干什么
imJaron
博客等级 码龄11年 121粉丝 286原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值