条件变量

2023-05-16

1.初始化条件变量pthread_cond_init


#include 
int pthread_cond_init(pthread_cond_t *cv,
const pthread_condattr_t *cattr);
返回值:函数成功返回0;任何其他返回值都表示错误
  

初始化一个条件变量。当参数cattr为空指针时,函数创建的是一个缺省的条件变量。否则条件变量的属性将由cattr中的属性值来决定。调用pthread_cond_init函数时,参数cattr为空指针等价于cattr中的属性为缺省属性,只是前者不需要cattr所占用的内存开销。这个函数返回时,条件变量被存放在参数cv指向的内存中。

可以用宏PTHREAD_COND_INITIALIZER来初始化静态定义的条件变量,使其具有缺省属性。这和用pthread_cond_init函数动态分配的效果是一样的。初始化时不进行错误检查。如:


pthread_cond_t cv = PTHREAD_COND_INITIALIZER;
  

不能由多个线程同时初始化一个条件变量。当需要重新初始化或释放一个条件变量时,应用程序必须保证这个条件变量未被使用。

 

2.阻塞在条件变量上pthread_cond_wait


#include 
int pthread_cond_wait(pthread_cond_t *cv,
pthread_mutex_t *mutex);
返回值:函数成功返回0;任何其他返回值都表示错误
  

函数将解锁mutex参数指向的互斥锁,并使当前线程阻塞在cv参数指向的条件变量上。

被阻塞的线程可以被pthread_cond_signal函数,pthread_cond_broadcast函数唤醒,也可能在被信号中断后被唤醒。

pthread_cond_wait函数的返回并不意味着条件的值一定发生了变化,必须重新检查条件的值。

pthread_cond_wait函数返回时,相应的互斥锁将被当前线程锁定,即使是函数出错返回。

一般一个条件表达式都是在一个互斥锁的保护下被检查。当条件表达式未被满足时,线程将仍然阻塞在这个条件变量上。当另一个线程改变了条件的值并向条件变量发出信号时,等待在这个条件变量上的一个线程或所有线程被唤醒,接着都试图再次占有相应的互斥锁。

阻塞在条件变量上的线程被唤醒以后,直到pthread_cond_wait()函数返回之前条件的值都有可能发生变化。所以函数返回以后,在锁定相应的互斥锁之前,必须重新测试条件值。最好的测试方法是循环调用pthread_cond_wait函数,并把满足条件的表达式置为循环的终止条件。如:


pthread_mutex_lock();
while (condition_is_false)
	pthread_cond_wait();
pthread_mutex_unlock();
  

阻塞在同一个条件变量上的不同线程被释放的次序是不一定的。

注意:pthread_cond_wait()函数是退出点,如果在调用这个函数时,已有一个挂起的退出请求,且线程允许退出,这个线程将被终止并开始执行善后处理函数,而这时和条件变量相关的互斥锁仍将处在锁定状态。

 

3.解除在条件变量上的阻塞pthread_cond_signal


#include 
int pthread_cond_signal(pthread_cond_t *cv);
返回值:函数成功返回0;任何其他返回值都表示错误
  

函数被用来释放被阻塞在指定条件变量上的一个线程。

必须在互斥锁的保护下使用相应的条件变量。否则对条件变量的解锁有可能发生在锁定条件变量之前,从而造成死锁。

唤醒阻塞在条件变量上的所有线程的顺序由调度策略决定,如果线程的调度策略是SCHED_OTHER类型的,系统将根据线程的优先级唤醒线程。

如果没有线程被阻塞在条件变量上,那么调用pthread_cond_signal()将没有作用。

 

4.阻塞直到指定时间pthread_cond_timedwait


#include 
#include 
int pthread_cond_timedwait(pthread_cond_t *cv,
pthread_mutex_t *mp, const structtimespec * abstime);
返回值:函数成功返回0;任何其他返回值都表示错误
  

函数到了一定的时间,即使条件未发生也会解除阻塞。这个时间由参数abstime指定。函数返回时,相应的互斥锁往往是锁定的,即使是函数出错返回。

注意:pthread_cond_timedwait函数也是退出点。

超时时间参数是指一天中的某个时刻。使用举例:


pthread_timestruc_t to;
to.tv_sec = time(NULL) + TIMEOUT;
to.tv_nsec = 0;
  

超时返回的错误码是ETIMEDOUT。

 

5.释放阻塞的所有线程pthread_cond_broadcast


#include 
int pthread_cond_broadcast(pthread_cond_t *cv);
返回值:函数成功返回0;任何其他返回值都表示错误
  

函数唤醒所有被pthread_cond_wait函数阻塞在某个条件变量上的线程,参数cv被用来指定这个条件变量。当没有线程阻塞在这个条件变量上时,pthread_cond_broadcast函数无效。

由于pthread_cond_broadcast函数唤醒所有阻塞在某个条件变量上的线程,这些线程被唤醒后将再次竞争相应的互斥锁,所以必须小心使用pthread_cond_broadcast函数。

 

6.释放条件变量pthread_cond_destroy


#include 
int pthread_cond_destroy(pthread_cond_t *cv);
返回值:函数成功返回0;任何其他返回值都表示错误
  

释放条件变量。

注意:条件变量占用的空间并未被释放。

 

7.唤醒丢失问题

在线程未获得相应的互斥锁时调用pthread_cond_signal或pthread_cond_broadcast函数可能会引起唤醒丢失问题。

唤醒丢失往往会在下面的情况下发生:

  1. 一个线程调用pthread_cond_signal或pthread_cond_broadcast函数;
  2. 另一个线程正处在测试条件变量和调用pthread_cond_wait函数之间;
  3. 没有线程正在处在阻塞等待的状态下。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

条件变量 的相关文章

  • ExpRe[18] 手动构建Docker镜像[1] 指定cuda、python包版本

    文章目录 指定cuda版本准备miniconda创建环境 xff0c 指定包版本使用 96 git clone b 96 指定分支并安装 总结和问答练习 时效性 本篇撰写时间为2021 12 9 xff0c 由于计算机技术日新月异 xff0
  • 资料分享:TI AM5708平台特点和典型应用

    此文章原创来源于 xff1a 创龙电子 产品简介 xff1a AM5708开发板是一款由创龙基于TI AM570x浮点DSP C66x 43 ARM Cortex A15工业控制及可编程音视频处理器 由SOM TL570x核心板设计的开发板
  • Linux系统的休眠与唤醒简介

    转文地址 xff1a http blog 163 com jiaguang3010717 64 126 blog static 1268082432010310103037253 系统挂起 xff08 Suspend xff09 是电源管理
  • intellij idea cpu占用率太大太满 运行速度太慢 使了五个解决方法最终成功

    突然发现 xff0c intellij idea 特别卡 xff0c 在代码间移动的时候 xff0c 居然刷新都跟不上 xff0c 然后打开任务管理器一看 xff0c CPU占用率100 intellij idea自己一个程序的占用率就高达
  • Ubuntu21.04安装cuda10.2和cudnn

    系统 xff1a Ubuntu21 04 显卡 xff1a NVIDIA 1080Ti cuda是NVIDIA公司设计用来加速GPU训练的 xff0c 而cudnn则是可以把cuda应用到深度学习领域 xff0c 如果想用GPU跑深度神经网
  • 基于C语言的状态机实现技术

    一 简介 有限状态机是一种用来进行对象行为建模的工具 xff0c 其作用主要是描述对象在它的生命周期内所经历的状态序列 xff0c 以及如何响应来自外界的各种事件 有限状态机 xff08 Finite State Machine或者Fini
  • wampserve详细安装教程(手把手教你搭建)

    前提提醒 xff1a 如果你为纯小白直接按照操作步骤进行即可 xff08 忽略进阶教程 xff09 xff0c 如果你知道进阶教程是什么可参照教程中的非小白步骤 使用前请关闭其他本地环境软件 xff0c 否则会出现冲突 该教程为本地环境搭建
  • Ubuntu18.04扩展home目录分区记录

    前言 最近Ubuntu18 04系统的home目录空间不够用了 xff0c 之前安装系统的时候 xff0c 给home分配的空间只占了根目录的很小一部分 xff0c 因此就想把根目录的空余空间转给home 涉及到系统分区调整 xff0c 因
  • 优化后亲测可用!免费下载QQ音乐大部分资源

    音乐下载器 优化后亲测可用 xff01 免费下载QQ音乐大部分资源 眼看着网上许多下歌的插件用不了了 xff0c 又不想买VIP xff0c 便非常着急 突然我想到了接口这玩意儿 xff0c 于是我 奥我真是个人才 xff01 突然我看见了
  • 自动祝福程序(定时发送消息)

    有个同学找我帮忙 xff1a 明天是她朋友的生日 xff0c 但她没时间发送祝福 xff0c 问我能不能弄个自动发送 我想 xff0c QQ并没有内置的定时发送功能 xff0c 紧接着又想起了QQ刷屏助手 xff08 见我以前的博文 xff
  • 停更

    停更CSDN CSDN是我的第一个博客 xff0c 它也很完美 xff0c 但我的博客经常没能通过它的审核 xff0c 用起来很不爽 因此 xff0c 我决定停更CSDN xff0c 以后的博客都将发布到博客园 新博客链接 https ww
  • 停更规则更新

    我觉得嘛 来这里写东西点击量更高 所以以后软件不在这里发 其他的东西我还是会更新的 xff01 另外 xff0c 我会设定从WordPress个人博客上进行博客搬家 xff0c 不过 xff0c 除了上面所谓的 其他东西 以外 xff0c

随机推荐

  • 免费建站记

    好久不见 xff01 另外 xff0c 我可能还会发布一篇国内操作系统的测评记录 xff08 会不会发布取决于我写不写得完 xff09 首先 xff0c 这篇文章是从我个人博客上搬运的 xff0c 所以可能有些地方会有格式上的不正确 xff
  • 如果没有Linux,这个世界会怎样?

    众所周知 xff0c Linux是一个开源的操作系统 自从它流行起来 xff0c 微软就渐渐失去了地位 Linux在我们生活中的每一处 xff0c 但是 xff0c 假如没有Linux这一些开源操作系统 xff0c 会发生什么 xff1f
  • 音乐播放器

    完善音乐下载器时找到一个音乐播放器 xff0c 自己完善了下 软件原作者 xff1a 嘟嘟还没长大 完善内容 支持文件拖动打开 支持自动获取必应每日一图并显示 随机播放支持选择路径 代码 span class token keyword i
  • Python Tkinter颜色参考程序

    这是一个颜色参考程序 xff0c Python程序员专用 点击任意颜色可以复制颜色的英文名称 已经修改前景色 xff0c 所有字都看得清 xff08 终于找到一件比肝作业更累的事情 xff09 话不多说 xff0c 贴代码 代码 span
  • 脚本控制nginx

    以下 etc init d nginx 文件的内容 bin bash nginx Startup script for the Nginx HTTP Server it is v 0 0 2 version chkconfig 85 15
  • 关于计算机系统基础debian 11安装(感觉也适用debian10啥的)

    一定要记住自己起的用户名 xff01 xff01 xff01 xff01 xff01 xff01 xff01 还要记得自己的密码 额 xff0c 这门课程需要安装virtualbox和debian xff0c 有的同学会像我一样为此苦恼 x
  • android获取wifi的IP,子网掩码,网关,dns等信息

    使用 DhcpInfo 获取这些信息 xff0c 返回的是一个int型数据 xff0c 转换下得到想要的信息 xff0c 代码如下 xff1a public class MainActivity extends Activity priva
  • 【iOS开发-画线】使用贝塞尔曲线(UIBezierPath)画线

    步骤 xff1a span class hljs comment 创建贝塞尔曲线对象 span UIBezierPath span class hljs variable currenPath span 61 UIBezierPath be
  • 电脑连接无线路由上不了网 连接手机热点却可以上网

    mercury wireless n adapter 外置无线网卡 1 在网络设置中删除连接过的无线网络 2 设备管理器 网卡右键 属性 高级 wifi config wifi xff08 代替performance xff09 3 ban
  • Godot Engine:GDScript 4.X中语法的变化(2020年8月4日 更新)

    文章目录 4 X版 GDScript范例支持注解属性 xff08 Properties xff09 的定义格式await关键字代替yield加入super关键字去除了多级调用问题小结 4 X版 GDScript范例 支持注解 从4 x开始
  • mysql group by 取出分组结果中每一组的某个字段值不同的数据 分组

    数据 xff1a 目的 xff1a 基于以上查询结果得到每一组指标 xff08 KPI CODE xff09 中不同的KPI INSTANCE的值的数据 预期是取出上图中的第一条数据和第二或第三条数据中的任何一条 尝试 xff1a 刚开始直
  • Codeblocks 常用快捷键整理

    Ctrl 43 Shift 43 C 注释选中文本 Ctrl 43 Shift 43 X 解除选中文本的注释 Shift 43 Tab 回退一个制表符 Ctrl 43 PageUp xff08 Ctrl 43 PageDown xff09
  • 将PNG序列帧图片合成视频

    import globimport cv2def skadi idle img array 61 print 34 开始读取图片 34 修改此处为自己的路径for filename in glob glob r 34 F interact
  • 在树莓派3b/3b+上搭建rt-thread多核开发环境

    1 本文目的 nbsp nbsp nbsp 本 主要介绍如何快速 效的搭建树莓派rt thread的开发环境 按照 章的步骤 可以很快速的将rt thread SMP系统在树莓派上运 起来 2 准备条件 nbsp nbsp 1 raspbe
  • 百度在线人脸识别API简单实现教程

    这里 xff0c 记录一下百度人脸识别在线API的调用 xff0c 语言是python2 7 xff0c 供大家一起学习参考 本教程目录如下 1 申请百度人脸识别应用 2 获取token 3 图片的base64编码 4 人脸识别 5 结果绘
  • java中获取农历日期以及星期几

    34 status 34 200 34 msg 34 34 操作成功 xff01 34 34 success 34 true 34 data 34 34 weekend 34 34 星期二 34 34 date 34 34 2021年12月
  • syntax error: bad substitution是什么问题

    终端出现syntax error bad substitution是什么问题 解决办法 xff1a sudo dpkg reconfigure dash 在选择项中选N0 从 ubuntu 6 10 开始 xff0c ubuntu 就将先前
  • 如何获取自己的公网地址

    我们在上网的时候 xff0c 可以获取自己的公网地址 xff0c 比如在百度上输入ip地址 xff0c 就能显示自己的公网ip 下面讲解下 xff0c 从内网里面上网 xff0c 获取本机公网ip的原理 xff0c 如下所示 xff1a 本
  • 拯救被WSL占满的C盘

    适用场景 1 使用Windows 10做为开发平台 xff0c 并且C盘空间不是特别富裕 2 使用Windows自带的Windows Subsystem for Linux xff08 WSL xff09 默认将Liunx子系统安装在了C盘
  • 条件变量

    1 初始化条件变量pthread cond init include int pthread cond init pthread cond t cv const pthread condattr t cattr 返回值 xff1a 函数成功