嵌入式学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…...
掌握子网划分:优化IP分配与管理
子网划分是通过调整子网掩码,将单一IP网络划分为多个逻辑子网的过程,其核心原理是借用主机位作为子网位以优化地址分配和管理。具体方法与原理如下: 一、子网划分基本原理 核心目的: 减少IP浪费:避免大块地址闲置&…...
qt控制台程序与qt窗口程序在读取数据库中文字段的差异!!巨坑
问题:最近在自己编写一个类,这个类需要对mysql数据库进行插入和查询。因为最后是以一个类文件的形式拿来单独使用,所以在创建项目的时候就创建了一个qt的控制台程序。但是在对数据库的内容进行查询时,出现了中文乱码。参考了之前的…...
解决神经网络输出尺寸过小的实战方案
训练CIFAR10分类模型时出现报错:RuntimeError: Given input size: (256x1x1). Calculated output size: (256x0x0). Output size is too small。该问题由网络结构设计缺陷导致图像尺寸过度缩小引发。 核心原因分析 网络结构缺陷 原始模型采用六层卷积层,…...
Flask 核心概念速览:路由、请求、响应与蓝图
一、路由参数与请求方法 Flask 路由允许定义多种参数类型,并通过 methods 属性限制请求方法。 1. 路由参数类型: 除了默认的 string,Flask 还支持: int: 匹配整数,自动转换为 Python int 类型。非数字输入会返回 404。 float: 匹配浮点数,自动转换为 Python float 类型…...

2025年大模型平台落地实践研究报告|附75页PDF文件下载
本报告旨在为各行业企业在建设落地大模型平台的过程中,提供有效的参考和指引,助力大模型更高效更有价值地规模化落地。本报告系统性梳理了大模型平台的发展背景、历程和现状,结合大模型平台的特点提出了具体的落地策略与路径,同时…...
【美团技术团队】从实际案例聊聊Java应用的GC优化
【美团技术团队】从实际案例聊聊Java应用的GC优化 1. 美团技术团队优秀文章2. 绪论 1. 美团技术团队优秀文章 Java NIO浅析 https://tech.meituan.com/2016/11/04/nio.html红黑树深入剖析及Java实现 https://tech.meituan.com/2016/12/02/redblack-tree.htmlJava 8系列之重新认…...
Neovim - LSP 底层原理,难点配置(二)
Neovim LSP 的工作原理 基本概念 LSP(Language Server Protocol)可以理解成是一个"语言助手"。每种编程语言都有自己的"语言助手"(比如 TypeScript 的 tsserver),这些助手能告诉你: 哪写错了(语法错误)哪能跳转(方法定义,引用)哪可以补全(自…...
Java 抗量子算法:构建后量子时代的安全基石
一、量子计算带来的加密挑战 在传统加密体系中,RSA、ECC 等公钥算法依赖大数分解和离散对数问题的难解性。然而,量子计算机的 Shor 算法可在多项式时间内破解这些算法,使现有加密体系面临颠覆性威胁。例如,2048 位 RSA 密钥的破解…...

【设计模式-3.7】结构型——组合模式
说明:本文介绍结构型设计模式之一的组合模式 定义 组合模式(Composite Pattern)又叫作整体-部分(Part-Whole)模式,它的宗旨是通过将单个对象(叶子节点)和组合对象(树枝…...

使用Node.js分片上传大文件到阿里云OSS
阿里云OSS的分片上传(Multipart Upload)是一种针对大文件优化的上传方式,其核心流程和关键特性如下: 1. 核心流程 分片上传分为三个步骤: 初始化任务:调用InitiateMultipartUpload接口创建上传任务…...