Linux多线程(2)线程安全(同步与互斥)

news2024/11/28 9:38:22

1.线程安全

概念

在多线程程序中,涉及到了对共享资源的操作,则有可能导致数据的二义性,而线程安全指的是,就算对共享资源进行操作也不会导致数据二义。

总结:多线程中对共享资源的操作不会出现问题。

实现:同步与互斥

同步:通过条件控制,让多执行对资源的获取更加合理

同步的实现:条件变量;信号量;

互斥:通过同一时间执行流对资源访问的唯一性,保证访问安全

互斥的实现:互斥锁;

2.互斥

(下面是互斥锁原理)

互斥锁实现互斥:实现对共享资源的唯一访问

本质:就是一个0、1的计数器,通过0/1标记资源的访问状态(0表示不可访问;1表示可访问)

在访问资源之前进行加锁操作(通过状态判断是否可访问,不可访问则阻塞)

在访问资源之后进行解锁操作(将资源状态置为可访问状态,唤醒其他阻塞的线程)

另一个理解:访问之前加锁(获取锁资源-获取不到就阻塞),访问资源完毕解锁(归还锁资源)

多个线程想要实现互斥,必须访问同一个锁,也就意味着锁是一个共享资源

互斥锁操作本身必须是安全的:

(下面是互斥锁本身是安全的原理,不要与上面混淆)

这个时候有个指令exchange,功能为交换cpu指定寄存器与内存的数据

互斥锁的操作:

  1. 先将指定寄存器中的值修改为0

  1. 将寄存器与内存中的数据进行互换

  1. 判断是否符合获取锁的条件或者说判断是否能够加锁

置换操作是一条指令完成的,不可被打断

因为在置换之前,把寄存器的值设置为0了,因此置换之后内存中互斥锁的值就是0;这样就保证了,不管我能不能加锁,至少在我之后的肯定加不了锁

if(寄存器数据 == 1)
    return
else
    阻塞

接口

代码演示

  1. 多线程中共享资源的访问如果不加锁会出现什么问题

黄牛抢票例子:有个火车站抢票系统,用全局变量ticket保存票数,4个黄牛抢票

因为判断有无票和抢票过程不是原子性,不是一次完成的,中间可能被打断其他的线程也强到了

解决方案:将判断有无票与抢票过程保护起来,中间不能被打断

部分代码,程序为xshell中 xianchen.c

  1. 如何使用互斥锁来保护临界区(共享资源的访问过程)

//概念:共享资源/临界资源;临界区-访问共享资源的这部分代码

死锁

预防死锁:破坏死锁产生的必要条件

1和2是互斥锁的要义所在,无法破坏

具体操作代码的时候要多注意:

  1. 多个线程间加锁顺序保持一致--尽可能预防环路产生的条件

  1. 采用非阻塞加锁,如果加不上锁,则把已经加锁成功的释放掉--破坏请求与保持条件

避免死锁:具体采取的解决方案

  1. 银行家算法

  1. 死锁检测算法

3.同步

通过条件控制让多线程对资源的获取更加合理

互斥只能保证安全,不能保证合理

同步主要是保证合理,不一定保证安全

资源获取的合理:通常指的是有资源才能处理,没资源就阻塞,等有资源了再被唤醒再处理

条件变量:提供了一个pcb等待队列以及阻塞和唤醒线程的接口

思想:如果一个线程不满足获取资源的条件,则通过阻塞接口阻塞线程

一个线程促使资源获取的条件满足了,则通过唤醒接口唤醒线程

注意:条件变量本身并不知道什么时候该阻塞,什么时候该唤醒,他只是提供接口

条件变量和互斥锁是搭配使用的

举例::

这时候形成新的死锁--卡住的--

解决方案:阻塞这一步的解锁和陷入休眠必须是原子操作(一步完成,不被打断)

操作接口

因条件的判断不能使用if语句,而是使用while语句,但是使用while语局程序卡死

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【AUTOSA】

目录 一、概述 二、限制与约束 三、功能描述 3.1 网络通信模式请求的转换 3.2 当前网络通信方式的输出 3.3 外围设备的控制 3.3.1 以太网接口控制器 3.4 多网络 3.5 网络模式状态机 3.5.1 初始化 3.5.2 在亚状态ETHSM_STATE_OFFLINE中的行为 3.5.3 子状态ETHSM_STA…

深入学习MYSQL-数据操纵及视图

前言 本博客中的例子和文字大部分来源于书籍《mysql必会知识》,后续会根据更多的书籍不断完善此笔记。 插入操作 可以这种方式向数据库插入两条数据,mysql和pg都支持这种写法。在实战中我们应该更多的使用这种写法,因为数据库的批量操作会…

TCP之滑动窗口和流量控制

TCP 利用发送字节数和接收字节数,这个二元组的唯一性保证顺序。讨论下保证顺序的具体算法,以及如何在保证顺序的基础上,同时追求更高的吞吐量。——TCP 的滑动窗口算法。 TCP 作为一个传输层协议,最核心的能力是传输。传输需要保证…

前端CSS学习(一)

1、基础认知 CSS概述&#xff1a;CSS:层叠样式表(Cascading style sheets)CSS作用是给页面中的HTML标签设置样式&#xff0c;起到美化修饰网页的作用CSS语法规则&#xff1a;CsS写在style标签中&#xff0c;style标签一般写在head标签里面&#xff0c; title 标签下面<!DOC…

AI类软件项目的应用场景

AI类的APP可以做很多事情&#xff0c;现在在很多业行都有具体的应用&#xff0c;从语音识别、图像识别到智能客服等都是不错的应用方向&#xff0c;在AI项目的时候一定要注意用户隐私&#xff0c;否则可能会带来不少潜在的问题。今天和大家分享一下这方面的内容&#xff0c;希望…

Call for Papers丨第三届GLB@KDD‘23 Workshop

鉴于介绍新数据集和Benchmark研究往往需要不同于常规论文的评审标准&#xff0c;计算机视觉和自然语言处理领域&#xff0c;以及最近的NeurIPS会议&#xff0c;都有专门致力于建立新Benchmark数据集和任务的Conference Track。然而在图机器学习领域&#xff0c;我们还没有类似的…

在 IDEA 中创建 Spring Boot 项目的方式(详细步骤教程)

开发环境 以下是我的开发环境 JDK 1.8Maven 3.6.3IDEA 2019&#xff08;2019 无所畏惧&#xff0c;即使现在已经 2023 年了哈哈哈&#xff09; 使用 Maven 的方式创建 Spring Boot 项目 下面的内容可能会因 IDEA 版本不同&#xff0c;而有些选项不同&#xff0c;但是大同小…

若依定制化改造

若依定制化改造 1 前端1.1 去除开屏加载动画1.2 去除登录时验证码1.3 修改网站标题&#xff08;主要是去除“若依”字样&#xff09; 2 后端2.1 用本地缓存替换Redis&#xff08;未完成&#xff09; 1 前端 1.1 去除开屏加载动画 做法&#xff1a; 效果&#xff1a; 这样子那…

契约锁助力公立医院“电子病历”评级,6大应用场景助力评审过关

2019年以来&#xff0c;公立医院每年绩效考核必须要过“电子病历关”&#xff0c;国家卫健委要求所有三级医院电子病历评级要达到4级以上&#xff0c;二级医院要达到3级以上。《电子病历系统应用水平分级评价管理办法&#xff08;试行&#xff09;及评价标准&#xff08;试行&a…

不可不知的脑网络

前言 人们常说&#xff0c;大脑是人类已知的最复杂的网络。人类大脑由大约1000亿个(1011个)神经元组成&#xff0c;由大约100万亿个(1014个)突触连接&#xff0c;这些神经元在多个空间尺度上进行组织&#xff0c;在多个时间尺度上进行功能交互。这个庞大的系统是我们所有思想、…

Prompt learning 教学[基础篇]:prompt基本原则以及使用场景技巧助力你更好使用chatgpt,得到你想要的答案

Prompt learning 教学[基础篇]&#xff1a;prompt基本原则以及使用场景技巧助力你更好使用chatgpt&#xff0c;得到你想要的答案 如果你想系统学习 如果你对 AI 和 Prompt Engineering 不是很了解&#xff0c;甚至连 ChatGPT 也不是很了解&#xff0c;那我建议你从基础篇开始读…

GPS定位与IP地址定位

在日常生活中&#xff0c;常用的定位技术包括GPS定位、基站定位与IP地址定位​、WIFI定位。 关于GPS定位 GPS(Global Positioning System&#xff0c;全球定位系统)起始于1958年美国军方的一个项目&#xff0c;1964年投入使用。20世纪70年代美国陆海空三军联合研制了新一代卫…

HBase入门 Phoenix使用第三方客户端DataGrip连接 连接包含hbase-site.xml配置(八)

1、因为hbase配置了phoenix HBase入门 Phoenix使用第三方客户端DataGrip连接&#xff08;六&#xff09; <property><name>phoenix.schema.isNamespaceMappingEnabled</name><value>true</value></property><property><name>…

@RequestBody,@RequestParam,@RequestPart应用场景和区别

ReqeustBody 使用此注解接收参数时&#xff0c;适用于请求体格式为 application/json&#xff0c;只能用对象接收 RequestParam 支持application/json&#xff0c;也同样支持multipart/form-data请求 RequestPart RequestPart这个注解用在multipart/form-data表单提交请求的方法…

封装Python脚本:使用钉钉机器人发送消息至钉钉

官方帮助文档&#xff1a;https://open.dingtalk.com/document/robots/custom-robot-access 一、获取自定义机器人webhook 可以通过如下步骤设置钉钉机器人&#xff1a; 首先建立或者进入某个群聊在群聊内部点击“设置>机器人>添加机器人” 添加一个自定义机器人&…

从Facebook到Diem币:社交媒体巨头在加密货币领域的演变

大家都知道Facebook是一个全球知名的社交媒体平台&#xff0c;几乎每个人都在其中与朋友分享照片、发表状态或留言。 然而&#xff0c;随着时间的推移&#xff0c;Facebook不仅仅局限于社交交流&#xff0c;而是逐渐涉足更广阔的领域&#xff0c;其中之一就是加密货币。在本文…

三菱FX5U系列PLC本体自带模拟量输入输出使用方法介绍及示例

三菱FX5U系列PLC本体自带模拟量输入输出使用方法介绍及示例 如下图所示,三菱FX5U本体自带2路模拟量输入和1路模拟量输出,打开CPU左侧的保护盖板即可看到接线端子的位置, 如下图所示,查看手册,可以看到模拟量输入的相关说明: 输入:DC0-10V 软元件:SD6020(通道1)、SD…

杂记(二)2023.5.11

目录 流程图应该如何绘制&#xff1f; coverage 泡鲁达拿铁是什么&#xff1f;泡鲁达英文是什么&#xff1f;什么来历&#xff1f; 为什么我的泡鲁达咖啡会送我一些面包条呢&#xff1f; 介绍一下欧内斯特 梅的《历史的教训》 介绍一下陆奥宗光 介绍一下陆奥宗光的《蹇蹇录…

多处最优服务次序问题——算法设计与分析(C实现)

问题描述&#xff1a;设有n个顾客同时等待一项服务。顾客i需要的服务时间为&#xff0c;共有s处可以提供此项服务。应该如何安排n个顾客的服务次序&#xff0c;才能使平均等待时间达到最小&#xff1f;平均等待时间是n个顾客的等待服务时间的总和除以n。 算法设计&#xff1a;对…

数据库软件基础搭建的思考(WAMPserver)

本文的目的是介绍关于构建个人小型医学数据库的软件基础方面的一些实践和思考&#xff0c;做到局域网访问&#xff0c;乃至外网访问。 wampserver简要介绍 WampServer是一款由法国人开发的Apache Web服务器、PHP解释器以及MySQL数据库的整合软件包。它可以在Windows操作系统…