条件变量(Condition Variable)详解

article/2025/10/28 16:27:23

条件变量(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的值,否则后果是不可预测的。

    相关日志

    • 漫话C++0x(五)—- thread, mutex, condition_variable漫话C++0x(五)—- thread, mutex, condition_variable
    • 把错误扼杀在编译期——static assert把错误扼杀在编译期——static assert
    • 一个轻量级C++单元测试框架——ztest一个轻量级C++单元测试框架——ztest
    • CLucene源码剖析(三) 实现跨平台的线程安全CLucene源码剖析(三) 实现跨平台的线程安全
    • 谈谈程序的可扩展性 谈谈程序的可扩展性

http://chatgpt.dhexx.cn/article/62T01kZ0.shtml

相关文章

Java Variable 变量

目录 变量1. 变量的作用域a. 类级变量b. 成员变量c. 局部变量 2. 基本数据类型a. 按内存占用级数b. 自动类型转换i. 十进制转二进制 c. 强制类型转换i. (XXX)ii. parseXXX() 3. 引用数据类型 变量 同时被 final 和 static 修饰的变量是常量。 1. 变量的作用域 变量的作用域分…

About Variables

Assessing Variable Types “It all began with a variable”, the storyteller began. Just kidding, no one starts their stories that way, even though variables are where all data stories begin. Variables define datasets. They are the characteristics or attr…

pytorch的Variable和Parameters的联系和区别

文章目录 前言一、Variable二、Parameter总结 前言 首先看一下官方文档&#xff1a; 一、Variable torch.autograd.Variable Variable是对Tensor的封装&#xff0c;操作与tensor基本一致&#xff0c;不同的是&#xff0c;每一个Variable被构建的时候&#xff0c;都包含三个…

关于variable的理解

引用莫烦大大的话来说&#xff0c;tensor是一个鸡蛋&#xff0c;而variable相当于一个篮子&#xff0c;把tensor装起来 其中variable有三个参数&#xff1a; data&#xff1a;存储了Tensor&#xff0c;是本体的数据 grad&#xff1a;保存了data的梯度&#xff0c;本事是个Varia…

深度学习——Variable(已经过时了!)

一、简介 深度学习中使用pytorch框架&#xff0c;使用的数据一般是torch中的tensor形式。但是在参数表示中&#xff0c;一般是用variable变量形式。 二、variable的使用 &#xff08;1&#xff09;如何将tensor转化为variable pytorch1.0之后tensor和variable没有区别了&am…

Pytorch的Variable详解

pytorch两个基本对象&#xff1a;Tensor&#xff08;张量&#xff09;和Variable&#xff08;变量&#xff09; 其中&#xff0c;tensor不能反向传播&#xff0c;variable可以反向传播。 tensor的算术运算和选取操作与numpy一样&#xff0c;一次你numpy相似的运算操作都可以迁…

13.2 用Patsy创建模型

1、patsy适合描述statsmodels的线性模型&#xff0c;其公式是一个特殊的字符串语法&#xff0c;表示为模型设计矩阵 2、patsy.dmatrices函数接收一个公式字符串和一个数据集&#xff0c;为线性模型设计矩阵 3、Pasty对象可以直接传递到算法&#xff0c;如下面的最小二乘回归 4、…

Could not find a version

目标检测—教你利用yolov5训练自己的目标检测模型 我自己的另一篇配置文件和代码地址博客总结 CondaHTTPError: HTTP 000 CONNECTION FAILED for url 的问题终极解决方案 配置环境 安装pytorch 利用Anaconda安装pytorch和paddle深度学习环境pycharm安装—免额外安装CUDA和c…

statsmodels遇到的坑!!!

ImportError: cannot import name cached_data ModuleNotFoundError: No module named patsy python SimpleExpSmoothing 错误 statsmodels安装包地址&#xff1a; Python Extension Packages for Windows - Christoph Gohlke (uci.edu) 现已完美解决~

python数据处理包_python数据处理包安装

1> 本机环境 C:\Python27>python Python 2.7.12rc1 (v2.7.12rc1:13912cd1e7e8, Jun 12 2016, 05:57:31) [MSC v.1500 64 bit (AMD64)] on win32 Type "help", "copyright", "credits" or "license" for more information.…

手把手教你用Python进行回归(附代码、学习资料)

作者&#xff1a; GURCHETAN SINGH 翻译&#xff1a;张逸 校对&#xff1a;丁楠雅 本文共5800字&#xff0c;建议阅读8分钟。本文从线性回归、多项式回归出发&#xff0c;带你用Python实现样条回归。 我刚开始学习数据科学时&#xff0c;第一个接触到的算法就是线性回归。在把…

【Python数据分析】实践编写篇2:用Python进行回归分析与相关分析

目录 一、前言 1.1 回归分析 1.2 相关分析 二、代码的编写 2.1 前期准备 2.2 编写代码 2.2.1 相关分析 2.2.2 一元线性回归分析 2.2.3 多元线性回归分析 2.2.4 广义线性回归分析 2.2.5 logistic回归分析 三、代码集合 一、前言 1.1 回归分析 是用于研究分析某一变量受其…

chatgpt赋能Python-python_patsy

Python Patsy: 一个用于统计建模的Python库 什么是Patsy&#xff1f; Patsy是一个Python库&#xff0c;用于进行统计建模和数据预处理。Patsy的主要目的是将数据转换为适合统计建模的格式。它是一个基于公式的语言&#xff0c;通过描述预测变量和目标变量之间的关系&#xff…

Simple Linear Regression:ONE

前言 对于一些库的说明 numpy&#xff1a;支持矩阵运算&#xff0c;在矩阵运算这方面可以完全替代基于向量编程的matlab pandas&#xff1a;这个是一个数据存储库&#xff0c;是以表单&#xff08;dataframe&#xff09;为基本单位&#xff0c;这个库的好处在于行列 索引并不是…

python建模库介绍:pandas与建模代码的结合,使用Patsy创建模型描述

13.1 pandas与建模代码的结合 使用pandas用于数据载入和数据清洗&#xff0c;之后切换到模型库去建立模型是一个常见的模型开发工作流。在机器学习中&#xff0c;特征工程时模型开发的重要部分之一&#xff0c;特征工程就是指从原生数据集中提取可用于模型上下文的有效信息的数…

py之patsy:patsy的简介、安装、使用方法之详细攻略

py之patsy&#xff1a;patsy的简介、安装、使用方法之详细攻略 目录 patsy的简介 patsy的安装 patsy的使用方法 patsy的简介 Patsy是一个python库&#xff0c;用于描述统计模型&#xff08;尤其是线性模型&#xff0c;或具有线性组件的模型&#xff09;和构建设计矩阵。Pats…

两个线程循环打印121212...

A线程打印1&#xff0c;B线程打印2&#xff0c;要求循环打印121212... 思路 两个线程&#xff0c;可以想到的是多线程编程&#xff0c;共享变量&#xff0c;数据等&#xff0c;设想先让一个线程打印1&#xff0c;然后处于等待&#xff08;wait&#xff09;状态&#xff0c;接着…