Linux线程——条件变量

什么是条件变量

条件变量是线程另一可用的同步机制。条件变量给多个线程提供了一个会合的场所。条件变量与互斥量一起使用时,允许线程以无竞争的方式等待特定的条件发生。

条件本身是由互斥量保护的。线程在改变条件状态前必须首先锁住互斥量,其他线程在获得互斥量之前不会察觉到这种改变,因为必须锁定互斥量以后才能计算条件。

条件变量使用之前必须首先初始化

静态初始化:pthread_cond_t cond = PTHREAD_COND_INITIALIZER可以把常量PTHREAD_COND_INITIALIZER赋给静态分配的条件变量。

动态初始化:pthread_cond_init(&cond,NULL);如果条件变量是动态分配的,可以使用pthread_cond_destroy函数对条件变量进行去除初始化(deinitialize)。
 

相关API

包含头文件

#include <pthread.h>

创建及销毁条件变量

函数原型
int pthread_cond_init(pthread_cond_t *restrict cond, const pthread_condattr_t *restrict attr);
int pthread_cond_destroy(pthread_cond_t cond);
参数解读
*cond全局变量pthread_cond_t cond的地址(pthread_cond_init(&cond,NULL);)
attr除非需要创建一个非默认属性的条件变量,否则pthread_cont_init函数的attr参数可以设置为NULL(pthread_cond_destroy(&cond);)
返回值

若成功返回0,否则返回错误编号。

等待条件变量

pthread_cond_wait等待条件变为真。如果在给定的时间内条件不能满足,那么会生成一个代表一个出错码的返回变量。传递给pthread_cond_wait的互斥量对条件进行保护,调用者把锁住的互斥量传给函数。函数把调用线程放到等待条件的线程列表上,然后对互斥量解锁,这两个操作都是原子操作。这样就关闭了条件检查和线程进入休眠状态等待条件改变这两个操作之间的时间通道,这样线程就不会错过条件的任何变化。pthread_cond_wait返回时,互斥量再次被锁住。

pthread_cond_timedwait函数的工作方式与pthread_cond_wait函数类似,只是多了一个timeout。timeout指定了等待的时间,它是通过timespec结构指定。

pthread_cond_wait立即返回,pthread_cond_wait等待一段时间后返回。

函数原型
int pthread_cond_wait(pthread_cond_t *restrict cond, pthread_mutex_t *restrict mutex);
int pthread_cond_timedwait(pthread_cond_t *restrict cond, pthread_mutex_t *restrict mutex, cond struct timespec *restrict timeout);
参数解读
*cond全局变量pthread_cond_t cond的地址
*restrict mutex全局变量pthread_mutex_t mutex的地址
返回值

若成功返回0,否则返回错误编号。

触发条件变量

这两个函数可以用于通知线程条件已经满足。pthread_cond_signal函数将唤醒等待该条件的某个线程,而pthread_cond_broadcast函数将唤醒等待该条件的所有进程

函数原型
int pthread_cond_signal(pthread_cond_t *cond);
int pthread_cond_broadcast(pthread_cond_t *cond);
参数解读

*cond:全局变量pthread_cond_t cond的地址。

返回值

若成功返回0,否则返回错误编号。

代码示例

线程条件控制实现线程的同步

#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>int data = 0;pthread_mutex_t mutex;
pthread_cond_t cond;//定义一个全局变量的条件变量
//pthread_cond_t cond = PTHREAD_COND_INITIALIZER//这也是初始化的一种并定义一个全局变量void *func1(void *arg)
{while(1){pthread_cond_wait(&cond,&mutex);//等待func2触发条件变量printf("over!!!!!!!!!!!!!!!!!!\n");data = 0;//将data置于0 则data不等3会重新进入func2sleep(1);}
}void *func2(void *arg)
{while(1){printf("t2:data = %d\n",data);pthread_mutex_lock(&mutex);//上锁data++;if(data == 3){pthread_cond_signal(&cond);//触发条件变量 func1等待接受后执行func1代码}pthread_mutex_unlock(&mutex);//解锁sleep(1);}
}int main()
{int ret;int num =999;pthread_t t1;pthread_t t2;pthread_mutex_init(&mutex,NULL);pthread_cond_init(&cond,NULL);//条件变量初始化ret = pthread_create(&t1,NULL,func1,(void *)&num);if(ret == 0){//printf("main:create thread success\n");}ret = pthread_create(&t2,NULL,func2,(void *)&num);if(ret == 0){//printf("main:create thread success\n");}pthread_join(t1,NULL);pthread_join(t2,NULL);	pthread_mutex_destroy(&mutex);pthread_cond_destroy(&cond);//销毁条件变量return 0;
}

由编译结果可知:data不等于3时fucn2会拿到互斥量并执行其中代码,当data等于3时触发条件变量并解锁,此时func1接受条件变量并将data重新置0,data等于0后func2就会重新进行。

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

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

相关文章

Python爬虫---解析---xpath

1.1 安装xpath&#xff1a; 点击安装Xpath 1.2 将安装好的程序解压&#xff0c;打开浏览器&#xff0c;找到程序扩展&#xff0c;把解压好的程序托进来&#xff0c;如下图所示&#xff1a; 1.3 设置快捷键&#xff1a;打开/关闭xpath 1.4 成功后的图例&#xff1a;按刚刚设…

MatGPT - 访问 OpenAI™ ChatGPT API 的 MATLAB® 应用程序

系列文章目录 前言 MatGPT 是一款 MATLAB 应用程序&#xff0c;可让您轻松访问 OpenAI 的 ChatGPT API。使用该应用程序&#xff0c;您可以加载特定用例的提示列表&#xff0c;并轻松参与对话。如果您是 ChatGPT 和提示工程方面的新手&#xff0c;MatGPT 不失为一个学习的好方…

Linux网络编程(一):网络基础(上)

参考引用 UNIX 环境高级编程 (第3版)嵌入式Linux C应用编程-正点原子 1. 网络通信概述 网络通信本质上是一种进程间通信&#xff0c;是位于网络中不同主机上的进程之间的通信&#xff0c;属于 IPC 的一种&#xff0c;通常称为 socket IPC&#xff0c;网络通信是为了解决在网络…

【ARM Trace32(劳特巴赫) 高级篇 21 -- Trace 系统性能分析 Performance Analyzer】

请阅读【Trace32 ARM 专栏导读】 文章目录 Performance AnalyzerPerf 操作步骤采样对象PC采样对象Memory采样对象 TaskPerformance Analyzer sample-based profiling 通常也叫做Trace32 的性能分析(Perf), 这个功能是通过周期性的采样来实现的。被采样到的数据可以被用于统计…

跨平台数据库管理软件Navicat Premium 16 mac高级功能

Navicat Premium 16 mac是一款功能强大的跨平台数据库管理工具&#xff0c;支持多种数据库类型&#xff0c;如MySQL、MariaDB、Oracle、SQLite、PostgreSQL等等。它提供了丰富的数据库管理功能和工具&#xff0c;可以帮助开发人员和数据库管理员快速地创建、管理和维护数据库。…

面向 NLP 任务的大模型 Prompt 设计

很久之前&#xff0c;我们介绍到&#xff0c;prompt是影响下游任务的关键所在&#xff0c;当我们在应用chatgpt进行nlp任务落地时&#xff0c;如何选择合适的prompt&#xff0c;对于SFT以及推理环节尤为重要。 不过&#xff0c;硬想不是办法&#xff0c;我们可以充分参考开源的…

14:00面试,14:08就出来了,问的问题有点变态。。。

从小厂出来&#xff0c;没想到在另一家公司又寄了。 到这家公司开始上班&#xff0c;加班是每天必不可少的&#xff0c;看在钱给的比较多的份上&#xff0c;就不太计较了。没想到5月一纸通知&#xff0c;所有人不准加班&#xff0c;加班费不仅没有了&#xff0c;薪资还要降40%…

局域网其他pc如何访问宿主机虚拟机IP?

文章目录 背景贝瑞蒲公英设置虚拟机网络连接测试1.连接远程服务2.连接远程桌面 背景 使用贝瑞蒲公英异地组网&#xff0c;将家里的pc作为pgsql服务器在公司使用&#xff0c;但是虚拟机的ip和端口访问不了 贝瑞蒲公英 设置虚拟机网络 就是添加端口转发规则 连接测试 1.连接远程…

C语言—每日选择题—Day57

指针相关博客 打响指针的第一枪&#xff1a;指针家族-CSDN博客 深入理解&#xff1a;指针变量的解引用 与 加法运算-CSDN博客 第一题 1. 下面程序段&#xff08;&#xff09; char *str[] {"ABC", "DEF", "GHI"}; puts(str[1]); A&#xff1a;A…

css的filter全属性介绍

原图&#xff1a; 模糊&#xff08;blur&#xff09; 单位可为px或rem&#xff0c;值越大&#xff0c;越模糊 filter:blur(3px) filter:blur(0.3rem) 亮度(brightness) 值可为数字或百分数&#xff0c;小于1时&#xff0c;亮度更暗&#xff1b;等于1时&#xff0c;无变化&am…

基于py32f030/qfn32开发的tft屏电子烟方案

一次性电子烟这些年在功能外观上不断迭代更新&#xff0c;在海外可以说是非常热门的电子烟产品。随着海外消费市场需求不断演变&#xff0c;用户开始追求更多可能比如&#xff1a;想知道设备还剩多少电池和烟油&#xff0c;想避免干烧的吸入口感和低电量的意外&#xff0c;想让…

实战案例:缓存不一致问题的解决(redis+本地缓存caffine)

一.问题引入 目前在写项目的时候&#xff0c;在B端查看文章&#xff0c;A端修改文章。为了增加效率&#xff0c;以及防止堆内存溢出&#xff0c;在B端选择本地缓存文章的方案。但是目前出现了A端对文章修改之后&#xff0c;B端读的还是旧数据&#xff0c;出现了缓存不一致的问…