嵌入式学Day25---Linux软件编程---线程间通信
目录
编辑
一、线程的分离属性
1.1.什么是分离属性
1.2.分离属性相关函数接口
1.初始化线程属性-pthread_attr_init()
2.销毁线程属性-pthread_attr_destory()
3.设置线程属性-pthread_setdetachstate()
1.3.注意
二、互斥锁
2.1.资源
2.2.互斥锁
1.什么是互斥锁
2.互斥锁的用途
3.临界区
2.3.函数接口
1.初始化互斥锁-pthread_mutex_init()
2.销毁互斥锁-pthread_mutex_destory()
3.枷锁-pthread_mutex_lock()
4.解锁-pthread_mutex_unlock()
2.4.注意点
三、死锁
3.1.什么是死锁
3.2.产生死锁的4个必要条件
1.互斥条件
2.不剥夺条件
3.请求保持条件
4.循环等待条件
3.3.如何避免死锁
1.加锁顺序保持一致
2.打破互斥条件、不可剥夺条件(不建议使用)
3.使用pthread_mutex_trylock替代pthread_mutex_lock
四、信号量
4.1信号量是什么
4.2.信号量的作用
4.3.函数接口
1.初始化信号量-sem_init()
2.销毁信号量-sem-destory()
3.申请信号量-sem_wait()
4.释放信号量-sem_post()
五、总结
一、线程的分离属性
1.1.什么是分离属性
线程在结束时由操作系统自动回收空间
1.2.分离属性相关函数接口
1.初始化线程属性-pthread_attr_init()
int pthread_attr_init(pthread_attr_t *attr);功能:初始化线程属性
2.销毁线程属性-pthread_attr_destory()
int pthread_attr_destroy(pthread_attr_t *attr);功能:销毁线程属性
3.设置线程属性-pthread_setdetachstate()
int pthread_attr_setdetachstate(pthread_attr_t *attr, int detachstate);功能: 将线程设置为分离属性 参数:attr:线程属性 detachstate:PTHREAD_CREATE_DETACHED 分离属性PTHREAD_CREATE_JOINABLE 加入属性(默认)
1.3.注意
线程使用分离属性后,将不会让进程发生阻塞,从而不会实现进程与线程的同步;
默认的属性,需要pthread_join(),来回收线程空间,会实现同步;
二、互斥锁
2.1.资源
资源是有限的,在程序运行过程中,一段代码、一段空间、一个变量、CPU、内存都可以看做资源
2.2.互斥锁
1.什么是互斥锁
是一种资源,当一个线程任务加锁,其余线程任务无法再次加锁,直到解锁后才能加锁;
2.互斥锁的用途
互斥锁主要是用来防止多个线程任务竞争某个资源;
3.临界区
加锁和解锁中间的代码称为临界代码也称为临界区
2.3.函数接口
1.初始化互斥锁-pthread_mutex_init()
int pthread_mutex_init(pthread_mutex_t *mutex, const pthread_mutexattr_t *attr);功能:初始化互斥锁参数:mutex:互斥锁attr:互斥锁属性 NULL返回值:成功返回0 失败返回-1
2.销毁互斥锁-pthread_mutex_destory()
int pthread_mutex_destroy(pthread_mutex_t *mutex);功能:销毁互斥锁参数:mutex:互斥锁返回值:成功返回0 失败返回-1
3.枷锁-pthread_mutex_lock()
int pthread_mutex_lock(pthread_mutex_t *mutex);功能:加锁参数:mutex:互斥锁返回值:成功返回0 失败返回-1
4.解锁-pthread_mutex_unlock()
int pthread_mutex_unlock(pthread_mutex_t *mutex);功能:解锁参数:mutex:互斥锁返回值:成功返回0 失败返回-1
2.4.注意点
1.互斥锁不能同步,多个任务依然保持异步执行,但是可以解决资源竞争
2.原子操作:最小的一次CPU操作,在执行原子操作时不会切换调度任务
三、死锁
3.1.什么是死锁
多线程加锁解锁导致多个任务均无法向下执行的状态称为死锁状态简称为死锁
3.2.产生死锁的4个必要条件
1.互斥条件
同一把锁不能被多个线程任务同时锁定
2.不剥夺条件
一个线程任务已经锁定了一个资源,不能被其他线程任务抢占,直到它使用完该资源
3.请求保持条件
如果没有拿到锁资源一直申请获得锁资源
4.循环等待条件
如果没有得到锁资源会一直等待
3.3.如何避免死锁
1.加锁顺序保持一致
2.打破互斥条件、不可剥夺条件(不建议使用)
3.使用pthread_mutex_trylock替代pthread_mutex_lock
pthread_mutex_trylock为尝试进行锁操作,若没有锁则不进行锁操作。
四、信号量
4.1信号量是什么
信号量是一种资源(可以初始化、销毁、申请、释放)
申请:资源数 > 0 申请操作让资源数-1
资源数 == 0 申请操作会阻塞,直到资源数不为0,申请得到资源后继续向下执行
释放:资源数+1
释放操作让资源数+1
4.2.信号量的作用
实现多线程间的同步(同步就是多个线程有一定的执行顺序)
4.3.函数接口
1.初始化信号量-sem_init()
int sem_init(sem_t *sem, int pshared, unsigned int value);功能:对信号量的初始化参数:sem:信号量空间首地址pshared:0 线程间共享非0 进程间共享 value:信号量的初始值返回值:成功返回0 失败返回-1
2.销毁信号量-sem-destory()
int sem_destroy(sem_t *sem);功能: 信号量的销毁
3.申请信号量-sem_wait()
int sem_wait(sem_t *sem);功能:申请信号量(资源数-1)资源数为0阻塞等待直到有资源申请后继续向下执行
4.释放信号量-sem_post()
int sem_post(sem_t *sem);功能:释放信号量(资源数+1)
五、总结
2024年8月8日,学习的第25天。今天主要是学习了线程间的通信,其中引出了互斥锁、信号量和死锁的知识。总体来说,这块还是比较难的。
加油!
相关文章:

嵌入式学Day25---Linux软件编程---线程间通信
目录 编辑 一、线程的分离属性 1.1.什么是分离属性 1.2.分离属性相关函数接口 1.初始化线程属性-pthread_attr_init() 2.销毁线程属性-pthread_attr_destory() 3.设置线程属性-pthread_setdetachstate() 1.3.注意 二、互斥锁 2.1.资源 2.2.互斥锁 1.什么是互斥锁 2.互…...

【实现100个unity特效之17】在unity中使用shader和ShaderGraph分别实现模糊特定层,高斯模糊效果
最终效果 Unity通过Shader来模糊场景画面 参考:【游戏开发小技】Unity通过UI全屏图来模糊场景画面(Shader | 模糊 | 滤镜 | Blur) ShaderGraph实现图片的高斯模糊 参考:【游戏开发实战】Unity ShaderGraph实现图片的高斯模糊效…...

Unity补完计划 之 SpriteEditer Multiple
本文仅作笔记学习和分享,不用做任何商业用途 本文包括但不限于unity官方手册,unity唐老狮等教程知识,如有不足还请斧正 1. SpriteEditer Multiple Automatic slicing - Unity 手册 这是用于裁剪图集的模式 应用之后精灵编辑器会看到Slice亮…...

C++ IOStream
IOStream 类流特性 不可赋值和复制缓冲重载了<< >> 状态位 示例 状态位操作函数coutcin getget(s,n)/get(s,n,d):getline otherif(!fs)/while(cin) operator void*()与 operator!()代码示例 File Stream open 函数 文件打开方式 文件读写 读写接口 一次读一个字符…...
2024/8/8训练
A - 无线网络整点栅格统计 题目链接 算法:模拟 题目大意 给你一个n*m的网格,然后输出每一个点作为顶点能构成的正方形数量(可以为斜正方形). 算法思路 本身题目数据是很小的,可以通过n^2的时间复杂度枚举每一个顶点,然后再通过n平方的时间复杂度枚举出另一个对角顶点,判断…...
项目的小结
项目场景: 作业的发布,打回 。 学生端做作业 由作业的state来确定作业是否上交,批改,打回作业。 实体类的建立,还有各种成员变量的设计要满足需求 问题描述 问题: 在进行上传作业后,老师端…...

【目标检测实验系列】YOLOv5高效涨点:基于NAMAttention规范化注意力模块,调整权重因子关注有效特征(文内附源码)
1. 文章主要内容 本篇博客主要涉及规范化注意力机制,融合到YOLOv5(v6.1版本,去掉了Focus模块)模型中,通过惩罚机制,调整特征权重因子,使模型更加关注有效特征,助力模型涨点。 2. 简要概括 论文地址&#x…...

LSPatch制作内置模块应用软件无需root 教你制作内置应用
前言 LSPatch功能非常强大,它是一款基于LSPosed核心的免Root Xposed框架软件。这意味着用户无需进行手机root操作,即可轻松植入内置Xposed模块,享受更多定制化的功能和体验,比如微某内置模块版等,这为那些不想root手机…...
Java设计模式七大原则
本篇为七大原则概述,后面会有每个原则的介绍,喜欢的朋友可以蹲一下哦!!!! Java设计模式的七大原则一般是指“面向对象设计原则”,这些原则有助于在设计软件系统时提高代码的可维护性、可扩展性和…...

Copy as cURL 字段含义
当前端在开发过程中,遇到接口错误反馈给后端人员时,一般在此接口处右键复制为cURL。 格式如下: curl https://xxx.xxx.cn/xxx/xxx/management/record/list \-H accept: application/json, text/plain, */* \-H accept-language: zh-CN,zh;q0…...

mysql更改密码后,若依 后端启动不了解决方案
我原先的mysql 密码是 数字字符串 我想改成000 纯数字 改完之后,连接的数据库的代码 也更改后 ,后端启动不了 因为原先 密码数字字符串 不需要用引号" " 括起来 我改成纯数字 需要用 " " 括起来 如下图 然后就可以运行成功了...
Redis--缓存击穿、缓存穿透、缓存雪崩
缓存击穿 什么是缓存击穿呢? 在高并发的场景下,一个热点的缓存数据在redis中突然失效(过期或被删除时,所有的读请求都会直接落在数据库上,导致数据库瞬间压力剧增,严重时可能会造成数据库宕机。这种情况就是所谓的“缓存击穿”。(…...

10个理由告诉你,为什么鸿蒙是下一个职业风口!
在当今科技飞速发展的时代,新的技术和趋势不断涌现,为人们带来了前所未有的机遇和挑战。鸿蒙操作系统作为我国自主研发的创新成果,正逐渐成为科技领域的焦点,被认为是下一个职业风口。 10个理由告诉你,为什么鸿蒙是下一…...
Gitlab仓库的权限分配以及如何查看自己的权限
在GitLab中,权限分配和查看自己的权限可以通过以下步骤进行: ### 1. 查看自己的权限 要查看你在某个GitLab项目中的权限,可以按照以下步骤操作: 1. 登录到GitLab。 2. 进入你想查看权限的项目页面。 3. 在左侧菜单中,…...

职业本科大数据实训室
一、职业本科大数据实训室建设背景 在数字化浪潮汹涌澎湃的今天,大数据已跃升为引领社会进步和经济发展的新引擎。随着《中华人民共和国国民经济和社会发展第十四个五年规划和2035年远景目标纲要》的深入实施,数字化转型作为国家战略的重要组成部分&…...

【密码学】网络攻击类型:窃听攻击、假冒攻击、欺骗攻击和重放攻击
一、窃听攻击、假冒攻击、欺骗攻击和重放攻击的定义 这些攻击从名字中就大概能知道他们的攻击原理,我就不赘述了,直接用一个表格来一次性介绍四种攻击方式。 攻击类型攻击原理窃听攻击攻击者监听网络中的数据传输以获取敏感信息。示例:在未加…...
探索WebKit的奥秘:塑造高效、兼容的现代网页应用
探索WebKit的奥秘:塑造高效、兼容的现代网页应用 在数字时代的洪流中,网页应用已成为连接用户与信息的桥梁,其性能、兼容性和用户体验直接决定了产品的成败。WebKit,作为众多现代浏览器背后的核心渲染引擎,承载着将HT…...

2-52 基于matlab局部信息的模糊C均值聚类算法(FLICM)
基于matlab局部信息的模糊C均值聚类算法(FLICM),是在FCM聚类算法的基础上结合了图像的邻域信息,有更好的鲁棒性。程序已调通,可直接运行。 2-52 局部信息的模糊C均值聚类算法 - 小红书 (xiaohongshu.com)...

JAVASE
1.泛型 泛型指类型参数化, 在定义期间,不知道调用时会使用什么类型,就可以添加泛型形参,在使用时传入实参固定类型即可。 泛型类: 泛型应用在类上。 一般用在类名后,用尖括号括起来。用大写字母作为泛型参…...

SpringBoot学习之EasyExcel解析合并单元格(三十九)
本解析主要采用反射来修改EasyExcel 返回的默认数据结构实现。 一、待解析表格 二、依赖 全部pom.xml文件如下,仅作参考: <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLo…...

微软PowerBI考试 PL300-选择 Power BI 模型框架【附练习数据】
微软PowerBI考试 PL300-选择 Power BI 模型框架 20 多年来,Microsoft 持续对企业商业智能 (BI) 进行大量投资。 Azure Analysis Services (AAS) 和 SQL Server Analysis Services (SSAS) 基于无数企业使用的成熟的 BI 数据建模技术。 同样的技术也是 Power BI 数据…...

Python:操作 Excel 折叠
💖亲爱的技术爱好者们,热烈欢迎来到 Kant2048 的博客!我是 Thomas Kant,很开心能在CSDN上与你们相遇~💖 本博客的精华专栏: 【自动化测试】 【测试经验】 【人工智能】 【Python】 Python 操作 Excel 系列 读取单元格数据按行写入设置行高和列宽自动调整行高和列宽水平…...

3.3.1_1 检错编码(奇偶校验码)
从这节课开始,我们会探讨数据链路层的差错控制功能,差错控制功能的主要目标是要发现并且解决一个帧内部的位错误,我们需要使用特殊的编码技术去发现帧内部的位错误,当我们发现位错误之后,通常来说有两种解决方案。第一…...
Linux云原生安全:零信任架构与机密计算
Linux云原生安全:零信任架构与机密计算 构建坚不可摧的云原生防御体系 引言:云原生安全的范式革命 随着云原生技术的普及,安全边界正在从传统的网络边界向工作负载内部转移。Gartner预测,到2025年,零信任架构将成为超…...
精益数据分析(97/126):邮件营销与用户参与度的关键指标优化指南
精益数据分析(97/126):邮件营销与用户参与度的关键指标优化指南 在数字化营销时代,邮件列表效度、用户参与度和网站性能等指标往往决定着创业公司的增长成败。今天,我们将深入解析邮件打开率、网站可用性、页面参与时…...

技术栈RabbitMq的介绍和使用
目录 1. 什么是消息队列?2. 消息队列的优点3. RabbitMQ 消息队列概述4. RabbitMQ 安装5. Exchange 四种类型5.1 direct 精准匹配5.2 fanout 广播5.3 topic 正则匹配 6. RabbitMQ 队列模式6.1 简单队列模式6.2 工作队列模式6.3 发布/订阅模式6.4 路由模式6.5 主题模式…...
Go 并发编程基础:通道(Channel)的使用
在 Go 中,Channel 是 Goroutine 之间通信的核心机制。它提供了一个线程安全的通信方式,用于在多个 Goroutine 之间传递数据,从而实现高效的并发编程。 本章将介绍 Channel 的基本概念、用法、缓冲、关闭机制以及 select 的使用。 一、Channel…...

如何更改默认 Crontab 编辑器 ?
在 Linux 领域中,crontab 是您可能经常遇到的一个术语。这个实用程序在类 unix 操作系统上可用,用于调度在预定义时间和间隔自动执行的任务。这对管理员和高级用户非常有益,允许他们自动执行各种系统任务。 编辑 Crontab 文件通常使用文本编…...
BLEU评分:机器翻译质量评估的黄金标准
BLEU评分:机器翻译质量评估的黄金标准 1. 引言 在自然语言处理(NLP)领域,衡量一个机器翻译模型的性能至关重要。BLEU (Bilingual Evaluation Understudy) 作为一种自动化评估指标,自2002年由IBM的Kishore Papineni等人提出以来,…...

华为OD机试-最短木板长度-二分法(A卷,100分)
此题是一个最大化最小值的典型例题, 因为搜索范围是有界的,上界最大木板长度补充的全部木料长度,下界最小木板长度; 即left0,right10^6; 我们可以设置一个候选值x(mid),将木板的长度全部都补充到x,如果成功…...