Linux线程安全(二)条件变量实现线程同步

目录
条件变量
条件变量初始化和唤醒
键盘触发条件变量唤醒线程demo
条件变量的等待
条件变量定时等待demo
条线变量实现多线程间的同步
条件变量
条件变量是为了控制多个线程的同步工作而设计的
比如说一个系统中有多个线程的存在但有且仅有一个线程在工作,我们需要等待这个线程执行完任务之后然后唤醒另一个线程执行另外一个任务,
那这个时候“正在工作的这个线程执行完任务”就是一个条件变量,等这个条件变量触发之后正在工作的线程就会休眠,然后新的线程会启动。
条件变量初始化和唤醒
#include <pthread.h>
//销毁条件变量 int pthread_cond_destroy(pthread_cond_t *cond);
//初始化条件变量
int pthread_cond_init(pthread_cond_t *restrict cond,
const pthread_condattr_t *restrict attr);
cond:条件变量
attr:属性默认为 NULL
返回值: 成功 0 失败 -1
#include <pthread.h>
//随机唤醒一个等待的线程 int pthread_cond_signal(pthread_cond_t *cond);
//唤醒所有正在等待的线程 int pthread_cond_broadcast(pthread_cond_t *cond);
键盘触发条件变量唤醒线程demo
#include <stdio.h>
#include <pthread.h>pthread_cond_t cond;
pthread_mutex_t mutex;int n = 0;void *task(void *arg)
{while (1){printf("%ld 线程等待条件\n", pthread_self());pthread_cond_wait(&cond, &mutex);if (n == 1){n = 0;printf("%ld 线程被唤醒,执行任务\n", pthread_self());}}
}int main()
{// 初始化锁与条件变量pthread_cond_init(&cond, NULL);pthread_mutex_init(&mutex, NULL);// 创建一个线程pthread_t tid;pthread_create(&tid, NULL, task, NULL);pthread_create(&tid, NULL, task, NULL);pthread_create(&tid, NULL, task, NULL);pthread_create(&tid, NULL, task, NULL);while (1){printf("1.唤醒随机一个线程 2.唤醒所有线程\n");int n = 0;scanf("%d", &n);if (n == 1){pthread_cond_signal(&cond); // 唤醒随机一个}else if (n == 2){pthread_cond_broadcast(&cond); // 唤醒所有}}
}
条件变量的等待
#include <pthread.h>
//定时等待
int pthread_cond_timedwait(pthread_cond_t *restrict cond,
pthread_mutex_t *restrict mutex,
const struct timespec *restrict abstime);
//一直等待
int pthread_cond_wait(pthread_cond_t *restrict cond,
pthread_mutex_t *restrict mutex);
cond:条件变量
mutex:互斥锁
abstime:定时器
返回值:

条件变量定时等待demo
#include <stdio.h>
#include <pthread.h>
#include <time.h>pthread_cond_t cond;void *task(void *arg)
{while (1){printf("输入任意键唤醒线程\n");getchar();pthread_cond_signal(&cond);}
}int main()
{// 0.初始化互斥锁pthread_mutex_t mutex;pthread_mutex_init(&mutex, NULL);// 1.初始化条件变量int ret = pthread_cond_init(&cond, NULL);if (ret < 0){perror("初始化条件变量失败\n");}// 创建一个线程pthread_t tid;pthread_create(&tid, NULL, task, NULL);// 2.开启定时等待while (1){// 设置时间struct timespec ts;//clock_gettime()获取时间函数//CLOCK_REALTIME:系统实时时间,可以从网络同步,也可以用户自行更改clock_gettime(CLOCK_REALTIME, &ts); #if 0 //timespec结构体,tv_sec为秒
struct timespec
{__time_t tv_sec; /* Seconds. 秒*/__syscall_slong_t tv_nsec; /* Nanoseconds.纳秒*/
}
#endifts.tv_sec += 5; // 时间增加 5 秒printf("开启定时等待5秒\n");//pthread cond wait函数的返回值为0,代表成功等待条件变量并且收到了通知。//如果返回值是一个非零值,则表示函数运行出现了错误//需要根据错误码进行处理。int ret = pthread_cond_timedwait(&cond, &mutex, &ts);printf("等待结束 %d\n", ret); //超时返回值110}
}
条线变量实现多线程间的同步
利用条件变量使三个线程轮流运作,线程1执行完之后执行线程2,线程2执行完之后执行线程3,线程3执行完之后重新执行线程1.
#include <stdio.h>
#include <pthread.h>// 定义三个条件
pthread_cond_t first; // 条件1
pthread_cond_t second; // 条件2
pthread_cond_t third; // 条件3pthread_mutex_t mutex;void *task(void *arg)
{while (1){pthread_cond_wait(&third, &mutex);printf("线程1运行\n");pthread_cond_signal(&first);}
}void *task1(void *arg)
{while (1){pthread_cond_wait(&first, &mutex);printf("线程2运行\n");pthread_cond_signal(&second);}
}void *task2(void *arg)
{while (1){pthread_cond_wait(&second, &mutex);printf("线程3运行\n");pthread_cond_signal(&third);}
}int main()
{// 初始化条件变量与线程锁pthread_mutex_init(&mutex, NULL);pthread_cond_init(&first, NULL);pthread_cond_init(&second, NULL);pthread_cond_init(&third, NULL);// 创建三个任务线程pthread_t tid;pthread_create(&tid, NULL, task, NULL);pthread_t tid1;pthread_create(&tid1, NULL, task1, NULL);pthread_t tid2;pthread_create(&tid2, NULL, task2, NULL);while (1){printf("输入任意键线程开始工作\n");getchar();pthread_cond_signal(&third);}
}
相关文章:
Linux线程安全(二)条件变量实现线程同步
目录 条件变量 条件变量初始化和唤醒 键盘触发条件变量唤醒线程demo 条件变量的等待 条件变量定时等待demo 条线变量实现多线程间的同步 条件变量 条件变量是为了控制多个线程的同步工作而设计的 比如说一个系统中有多个线程的存在但有且仅有一个线程在工作,…...
Linux初阶——线程(Part2):互斥同步问题
一、互斥锁 1、CPU 运算过程 执行完整个语句后,才会把数据写入内存;如果执行时被中断,那么数据和上下文就会保存到线程的 TCB,但数据并不会被写入内存。 1.1. 当 CPU 执行完整个语句时 CPU 最终执行完整个语句的过程 就用上图举…...
力扣——二叉树的后序遍历(C语言)
1.题目: 给你一棵二叉树的根节点 root ,返回其节点值的后序遍历。 2.原理: 这里的遍历,是要存入到数组中,所以需要建立数组,这里传参有*returnSize,需要求节点个数,可以调用前面Tr…...
利用kimi编程助手从0到1开始搭建小程序!
电脑崩了,更新5次小程序,什么都不剩!(但是遗留下来了一些东西,开源的思维和不断地对于技术的使用和掌握“一个软件更多的哲学:(01)优秀的ui页面设计(02)更加细…...
WSL(Ubuntu20.04)编译和安装DPDK
编译和安装DPDK DPDK可以使用工具meson和ninja在您的系统上进行配置、构建和安装。 DPDK配置 要配置DPDK构建,请使用: meson setup build --prefix/home/xx/dpdk19.11xxxx:~/dpdk-stable-19.11.14/$ meson setup build Message:Content Skipped libs…...
HLS协议之nginx-hls-多码率测试环境搭建
运行环境:ubuntu 20.04 时间:2024年10月26日 环境更新 sudo apt-get update sudo apt-get install build-essential libtool libpcre3 libpcre3-dev zlib1g-dev openssl下载nginx wget http://nginx.org/download/nginx-1.19.2.tar.gz tar xvzf n…...
函数式接口与回调函数实践
函数式接口与回调函数实践 一、Java 的函数式接口 是指仅包含一个抽象方法的接口,通常用于 lambda 表达式或方法引用。Java 8 引入了很多内置的函数式接口,比如 Runnable、Callable、Predicate、Function、Consumer 等 演示,数据类型转换的函…...
Windows11系统如何使用自带的录音、录屏工具?
电脑录音和录屏作为现代办公的辅助工具,不仅极大地提升了工作效率,也保障了信息传递的准确性和完整性。通过合理利用这些工具,我们可以更好地保存和管理重要资料,为办公带来无与伦比的便利。 在会议记录、讲座学习、语音备忘等场景…...
使用 web (vue 和DRF))实现 模拟一个IDE 功能思路
采用文件系统和数据库相结合的方案,不仅可以实现基本的文件管理,还可以为未来的扩展提供灵活性。结合我们讨论的内容,以下是更完善的策略: 方案概述:文件系统与数据库结合 文件系统负责实际的文件存储和执行操作&…...
智航船舶租赁综合管理系统
1.产品介绍 产品介绍方案 产品名称: 智航船舶租赁综合管理系统 主要功能: 船舶信息管理租赁合同管理运营调度与优化财务分析与报告功能介绍: 1. 船舶信息管理 具体作用与使用方式:该功能模块允许用户录入、编辑和查询所有船舶的详细信息,包括但...
统信UOS下启动图形界面应用工具monitor报JAVA相关错:An error has occurred. See the log file
☞ ░ 前往老猿Python博客 ░ https://blog.csdn.net/LaoYuanPython 一、前言 在博文《基于飞腾2000CPU浪潮电脑统信UOS安装达梦数据库详解 https://blog.csdn.net/LaoYuanPython/article/details/143258863》中介绍了基于飞腾2000CPU浪潮电脑统信UOS安装达梦数据库的详细过程…...
N-154基于springboot酒店预订管理系统
开发工具:IDEA 服务器:Tomcat9.0, jdk1.8 项目构建:maven 数据库:mysql5.7 前端技术:AdminLTEBootstrapLayUIHTMLjQuery 服务端技术:springbootmybatis-plusthymeleaf 本项目分前台和后台…...
微信小程序如何实现地图轨迹回放?
要在Uni-app中实现微信小程序的地图轨迹回放功能,你可以按照以下步骤进行操作: 在Uni-app项目中引入地图组件:在页面中使用uni-app提供的map组件,可以使用uni.createMapContext方法获取地图上下文对象,以便后续操作地图…...
vscode的一些使用心得
问题1:/home目录空间有限 连接wsl或者remote的时候,会在另一端下载一个.vscode-server,vscode的插件都会安装进去,导致空间增加很多,可以选择更换这个文件的位置 参考:https://blog.csdn.net/weixin_4389…...
Python金色流星雨(完整代码)
文章目录 环境需求完整代码下载代码代码分析1. 导入库和窗口设置2. 创建画笔对象3. 流星的颜色4. 定义流星类`Meteor`5. `meteor`方法:绘制流星6. `move`方法:流星的运动7. 创建流星对象列表8. 动画循环总结系列目录写在后面环境需求 python3.11.4PyCharm Community Edition …...
[山河CTF 2024] week3
一周不在家,这是补的最后一篇。后边的还有0xgame和shctf的末周。打不动了。 Crypto Approximate_n 题目分两部分,flag分两块两个RSA,第1个泄露了4个n_approxkpr的值,后边只泄露了1个。 第1部分利用以前的模板,造格…...
Java集合常见面试题总结(5)
HashSet 如何检查重复? 当你把对象加入HashSet时,HashSet 会先计算对象的hashcode值来判断对象加入的位置,同时也会与其他加入的对象的 hashcode 值作比较,如果没有相符的 hashcode,HashSet 会假设对象没有重复出现。但是如果发…...
牛客网刷题(3)(Java的几种常用包)
目录 一、牛客网案例题目。 二、Java常用包的总结。 <1>JAVA常用包(图片)。 <2>java.lang包。 <3>java.util包。 (1)集合框架。 1、Collection接口。 2、List接口。 3、Set接口。 4、Queue接口。 5、Map接口。 …...
PyTorch nn.Conv2d 空洞卷积
torch.nn.Conv2d() 中 dilation 参数控制卷积核的间隔 dilation controls the spacing between the kernel points 当 dilation1 时, 表示卷积核没有额外的空白间距, 也就是标准卷积当 dilation>1 时, 表示空洞卷积(dilated convolution) 动画演示: 手动计算 以 2*2 的卷…...
像素、分辨率、PPI(像素密度)、帧率的概念
文章目录 前言一、像素1、定义2、像素点也不是越多越好 二、分辨率1、定义 三、PPI(像素密度)1、定义2、计算公式3、视网膜屏幕 四、帧率1、帧 (Frame)2、帧数 (Frames)3、帧率 (Frame Rate)4、FPS (Frames Per Second)5、赫兹 五、其他1、英寸2、为何显示器尺寸以英寸命名 总结…...
如何快速掌握Avogadro 2:开源分子可视化工具的终极指南
如何快速掌握Avogadro 2:开源分子可视化工具的终极指南 【免费下载链接】avogadrolibs Avogadro libraries provide 3D rendering, visualization, analysis and data processing useful in computational chemistry, molecular modeling, bioinformatics, material…...
清华PPT模板终极指南:从零开始打造专业学术演示
清华PPT模板终极指南:从零开始打造专业学术演示 【免费下载链接】THU-PPT-Theme 清华主题PPT模板 项目地址: https://gitcode.com/gh_mirrors/th/THU-PPT-Theme THU-PPT-Theme是一个专门为清华大学师生和学术工作者设计的PPT模板集合,提供了多种符…...
2026测绘、遥感、地信三大专业就业现状对比
01测绘测绘目前的情况是易就业,劳动密集但薪酬不高,且比较辛苦。招聘网站上测绘的岗位一搜一大把:测绘实习岗位也非常多:但是大部分测绘岗位没有递进式积累。很多岗位会呈现一个类似下面公式的发展路线图:”助理--XX师…...
HoRain云--Lua协程
🎬 HoRain云小助手:个人主页 🔥 个人专栏: 《Linux 系列教程》《c语言教程》 ⛺️生活的理想,就是为了理想的生活! ⛳️ 推荐 前些天发现了一个超棒的服务器购买网站,性价比超高,大内存超划算!…...
嵌入式处理器IP选型指南:从ARM到RISC-V的权衡与实战
1. 从一场早餐会聊起:为什么32位处理器IP依然是嵌入式开发的硬通货最近在整理资料时,翻到一篇十多年前的老新闻,说的是IP供应商CAST要在DesignCon 2012上办一场免费的早餐研讨会,主题是他们新推出的BA22 32位处理器IP核。新闻里笔…...
连接器选型五大雷区:从故障数据到设计落地的实战手册
许多硬件团队的失效分析报告显示,连接器引发的现场故障占比长期居高不下,且症状极其隐蔽——间歇性黑屏、信号丢包、热插拔烧毁……这些问题往往在原型测试阶段难以复现,直到批量出货后才集中爆发。本文从电源、高速信号、射频三类典型应用出…...
ClawdOS:为AI Agent构建可视化操作系统的全栈实践
1. 项目概述:为你的AI大脑装上眼睛和手如果你和我一样,是OpenClaw(前身是Moltbot/Clawdbot)的早期用户,那你一定经历过这种场景:在终端里,你的AI助手聪明绝顶,能写代码、查资料、分析…...
嵌入式调试进阶:JScope RTT模式移植与性能实测(对比HSS,速度提升千倍)
嵌入式调试革命:JScope RTT模式深度优化与高频数据采集实战 在电机控制、电源管理和高速信号处理等嵌入式应用场景中,开发人员经常需要实时监控关键变量的变化趋势。传统调试工具往往面临采样率低、数据延迟大等问题,而SEGGER JScope的RTT模式…...
ESP32-C3原理图设计避坑指南:从电源到天线,新手最容易忽略的7个细节
ESP32-C3原理图设计避坑指南:从电源到天线,新手最容易忽略的7个细节 第一次接触ESP32-C3原理图设计时,很多开发者会直接参考官方规格书,但实际调试时却发现各种奇怪的问题:电源不稳定导致Wi-Fi断连、复位电路响应迟缓、…...
从零部署OpenClaw:打造私有AI助手全流程指南
1. 项目概述:从零部署你的专属AI助手 如果你对AI Agent(智能体)感兴趣,想拥有一个能24小时在线、不仅能聊天还能帮你执行任务、操控浏览器、生成图片的私人助手,但又觉得技术门槛太高、无从下手,那么你来对…...
