当前位置: 首页 > news >正文

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 条线变量实现多线程间的同步 条件变量 条件变量是为了控制多个线程的同步工作而设计的 比如说一个系统中有多个线程的存在但有且仅有一个线程在工作&#xff0c…...

Linux初阶——线程(Part2):互斥同步问题

一、互斥锁 1、CPU 运算过程 执行完整个语句后&#xff0c;才会把数据写入内存&#xff1b;如果执行时被中断&#xff0c;那么数据和上下文就会保存到线程的 TCB&#xff0c;但数据并不会被写入内存。 1.1. 当 CPU 执行完整个语句时 CPU 最终执行完整个语句的过程 就用上图举…...

力扣——二叉树的后序遍历(C语言)

1.题目&#xff1a; 给你一棵二叉树的根节点 root &#xff0c;返回其节点值的后序遍历。 2.原理&#xff1a; 这里的遍历&#xff0c;是要存入到数组中&#xff0c;所以需要建立数组&#xff0c;这里传参有*returnSize&#xff0c;需要求节点个数&#xff0c;可以调用前面Tr…...

利用kimi编程助手从0到1开始搭建小程序!

电脑崩了&#xff0c;更新5次小程序&#xff0c;什么都不剩&#xff01;&#xff08;但是遗留下来了一些东西&#xff0c;开源的思维和不断地对于技术的使用和掌握“一个软件更多的哲学&#xff1a;&#xff08;01&#xff09;优秀的ui页面设计&#xff08;02&#xff09;更加细…...

WSL(Ubuntu20.04)编译和安装DPDK

编译和安装DPDK DPDK可以使用工具meson和ninja在您的系统上进行配置、构建和安装。 DPDK配置 要配置DPDK构建&#xff0c;请使用&#xff1a; meson setup build --prefix/home/xx/dpdk19.11xxxx:~/dpdk-stable-19.11.14/$ meson setup build Message:Content Skipped libs…...

HLS协议之nginx-hls-多码率测试环境搭建

运行环境&#xff1a;ubuntu 20.04 时间&#xff1a;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 的函数式接口 是指仅包含一个抽象方法的接口&#xff0c;通常用于 lambda 表达式或方法引用。Java 8 引入了很多内置的函数式接口&#xff0c;比如 Runnable、Callable、Predicate、Function、Consumer 等 演示&#xff0c;数据类型转换的函…...

Windows11系统如何使用自带的录音、录屏工具?

电脑录音和录屏作为现代办公的辅助工具&#xff0c;不仅极大地提升了工作效率&#xff0c;也保障了信息传递的准确性和完整性。通过合理利用这些工具&#xff0c;我们可以更好地保存和管理重要资料&#xff0c;为办公带来无与伦比的便利。 在会议记录、讲座学习、语音备忘等场景…...

使用 web (vue 和DRF))实现 模拟一个IDE 功能思路

采用文件系统和数据库相结合的方案&#xff0c;不仅可以实现基本的文件管理&#xff0c;还可以为未来的扩展提供灵活性。结合我们讨论的内容&#xff0c;以下是更完善的策略&#xff1a; 方案概述&#xff1a;文件系统与数据库结合 文件系统负责实际的文件存储和执行操作&…...

智航船舶租赁综合管理系统

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酒店预订管理系统

开发工具&#xff1a;IDEA 服务器&#xff1a;Tomcat9.0&#xff0c; jdk1.8 项目构建&#xff1a;maven 数据库&#xff1a;mysql5.7 前端技术&#xff1a;AdminLTEBootstrapLayUIHTMLjQuery 服务端技术&#xff1a;springbootmybatis-plusthymeleaf 本项目分前台和后台…...

微信小程序如何实现地图轨迹回放?

要在Uni-app中实现微信小程序的地图轨迹回放功能&#xff0c;你可以按照以下步骤进行操作&#xff1a; 在Uni-app项目中引入地图组件&#xff1a;在页面中使用uni-app提供的map组件&#xff0c;可以使用uni.createMapContext方法获取地图上下文对象&#xff0c;以便后续操作地图…...

vscode的一些使用心得

问题1&#xff1a;/home目录空间有限 连接wsl或者remote的时候&#xff0c;会在另一端下载一个.vscode-server&#xff0c;vscode的插件都会安装进去&#xff0c;导致空间增加很多&#xff0c;可以选择更换这个文件的位置 参考&#xff1a;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

一周不在家&#xff0c;这是补的最后一篇。后边的还有0xgame和shctf的末周。打不动了。 Crypto Approximate_n 题目分两部分&#xff0c;flag分两块两个RSA&#xff0c;第1个泄露了4个n_approxkpr的值&#xff0c;后边只泄露了1个。 第1部分利用以前的模板&#xff0c;造格…...

Java集合常见面试题总结(5)

HashSet 如何检查重复? 当你把对象加入HashSet时&#xff0c;HashSet 会先计算对象的hashcode值来判断对象加入的位置&#xff0c;同时也会与其他加入的对象的 hashcode 值作比较&#xff0c;如果没有相符的 hashcode&#xff0c;HashSet 会假设对象没有重复出现。但是如果发…...

牛客网刷题(3)(Java的几种常用包)

目录 一、牛客网案例题目。 二、Java常用包的总结。 <1>JAVA常用包&#xff08;图片&#xff09;。 <2>java.lang包。 <3>java.util包。 &#xff08;1&#xff09;集合框架。 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、为何显示器尺寸以英寸命名 总结…...

深度学习在微纳光子学中的应用

深度学习在微纳光子学中的主要应用方向 深度学习与微纳光子学的结合主要集中在以下几个方向&#xff1a; 逆向设计 通过神经网络快速预测微纳结构的光学响应&#xff0c;替代传统耗时的数值模拟方法。例如设计超表面、光子晶体等结构。 特征提取与优化 从复杂的光学数据中自…...

Xshell远程连接Kali(默认 | 私钥)Note版

前言:xshell远程连接&#xff0c;私钥连接和常规默认连接 任务一 开启ssh服务 service ssh status //查看ssh服务状态 service ssh start //开启ssh服务 update-rc.d ssh enable //开启自启动ssh服务 任务二 修改配置文件 vi /etc/ssh/ssh_config //第一…...

测试markdown--肇兴

day1&#xff1a; 1、去程&#xff1a;7:04 --11:32高铁 高铁右转上售票大厅2楼&#xff0c;穿过候车厅下一楼&#xff0c;上大巴车 &#xffe5;10/人 **2、到达&#xff1a;**12点多到达寨子&#xff0c;买门票&#xff0c;美团/抖音&#xff1a;&#xffe5;78人 3、中饭&a…...

【快手拥抱开源】通过快手团队开源的 KwaiCoder-AutoThink-preview 解锁大语言模型的潜力

引言&#xff1a; 在人工智能快速发展的浪潮中&#xff0c;快手Kwaipilot团队推出的 KwaiCoder-AutoThink-preview 具有里程碑意义——这是首个公开的AutoThink大语言模型&#xff08;LLM&#xff09;。该模型代表着该领域的重大突破&#xff0c;通过独特方式融合思考与非思考…...

将对透视变换后的图像使用Otsu进行阈值化,来分离黑色和白色像素。这句话中的Otsu是什么意思?

Otsu 是一种自动阈值化方法&#xff0c;用于将图像分割为前景和背景。它通过最小化图像的类内方差或等价地最大化类间方差来选择最佳阈值。这种方法特别适用于图像的二值化处理&#xff0c;能够自动确定一个阈值&#xff0c;将图像中的像素分为黑色和白色两类。 Otsu 方法的原…...

cf2117E

原题链接&#xff1a;https://codeforces.com/contest/2117/problem/E 题目背景&#xff1a; 给定两个数组a,b&#xff0c;可以执行多次以下操作&#xff1a;选择 i (1 < i < n - 1)&#xff0c;并设置 或&#xff0c;也可以在执行上述操作前执行一次删除任意 和 。求…...

【论文阅读28】-CNN-BiLSTM-Attention-(2024)

本文把滑坡位移序列拆开、筛优质因子&#xff0c;再用 CNN-BiLSTM-Attention 来动态预测每个子序列&#xff0c;最后重构出总位移&#xff0c;预测效果超越传统模型。 文章目录 1 引言2 方法2.1 位移时间序列加性模型2.2 变分模态分解 (VMD) 具体步骤2.3.1 样本熵&#xff08;S…...

AI书签管理工具开发全记录(十九):嵌入资源处理

1.前言 &#x1f4dd; 在上一篇文章中&#xff0c;我们完成了书签的导入导出功能。本篇文章我们研究如何处理嵌入资源&#xff0c;方便后续将资源打包到一个可执行文件中。 2.embed介绍 &#x1f3af; Go 1.16 引入了革命性的 embed 包&#xff0c;彻底改变了静态资源管理的…...

20个超级好用的 CSS 动画库

分享 20 个最佳 CSS 动画库。 它们中的大多数将生成纯 CSS 代码&#xff0c;而不需要任何外部库。 1.Animate.css 一个开箱即用型的跨浏览器动画库&#xff0c;可供你在项目中使用。 2.Magic Animations CSS3 一组简单的动画&#xff0c;可以包含在你的网页或应用项目中。 3.An…...

STM32HAL库USART源代码解析及应用

STM32HAL库USART源代码解析 前言STM32CubeIDE配置串口USART和UART的选择使用模式参数设置GPIO配置DMA配置中断配置硬件流控制使能生成代码解析和使用方法串口初始化__UART_HandleTypeDef结构体浅析HAL库代码实际使用方法使用轮询方式发送使用轮询方式接收使用中断方式发送使用中…...