liunx线程互斥

临界资源和临界区

临界资源:多线程执行流共享的资源就叫临界资源。

临界区:每个线程中,访问临界区的代码,就叫临界区。

互斥:任何时候,互斥保证只有一个执行流进入临界区,访问临界资源,通过对临界资源起到保护作用

原子性:不会被任何调度机制打断的操作,该操作有两态,要么完成,要么未完成。


  局部变量和共享变量

  • 局部变量:变量的地址空间在线程栈空间内,变量归属于单个线程,其他线程无法看到这个变量
  • 共享变量:变量可以在线程间共享,完成线程之间的交互

当多个线程共发操作共享变量,会出现问题!

例如:对g_val全局变量进行--操作,在汇编层面会被分成三步:

  1. load:从内存中读取数据到寄存器中
  2. update:更新寄存器的值,执行-1操作
  3. store:将新值,将寄存器写回共享变量g_val的内存地址

所以在一个线程执行三步操作期间,发生线程切换,其他线程对g_val变量进行操作,就会导致问题。问题就在于:共享资源没有被保护起来

保护临界资源的方法

  • 代码需要互斥行为,当代码进入临界区执行时,不允许其他线程进入该临界区
  • 如果多个线程同时要求执行临界区代码,并且临界区没有线程在执行,那么只允许一个线程进入该临界区
  • 如果线程不在临界区中执行,那么该线程不能阻止其他线程进入临界区

方法就是:需要在临界区之间加锁

互斥锁操作的原理

为了实现互斥锁操作,大多数体系结构都提供了swap或exchange指令,该指令的作用把寄存器和内存单元的数据相交换,由于只有一条指令,保证了原子性,即使是多处理器平台,访问内存的,总线周期也有先后,一个处理器的交换指令执行时另一个处理器的指令只能等待总线周期。

交换的本质:所有线程在争锁时,只有"1",交换是一条汇编-->原子的

lock操作:

  • %al寄存器值变成0
  • 交换%al寄存器值和内存的值(mutex的值变成0,%al的值变成1)
  • 判断%al寄存器的值(如果此时发生线程切换,原线程会把%al的值带走,新线程使用%al的寄存器和mutex的0交换,新线程判断false) 
  • goto会重新执行上面代码,重新让%al=0

unlock操作:

  • 将mutex=1
  • 唤醒等待mutex的线程,让他们竞争锁

可重入和线程安全

  • 线程安全:多个线程并发同一段代码时,不会出现不同的结果。常见于对全局变量和静态变量进行操作,但是在没有锁保护的情况下,会出现该问题
  • 重入:同一个函数被不同的执行流,当前一个流程还没有执行完,还有其他的执行流再次进入,我们称之为重入。一个函数在重入的情况下,运行情况不会出现任何问题,则称为函数是可以重入的,否则,是不可重入函数

常见线程不安全的情况

  1. 不保护共享变量的函数
  2. 函数状态随着调用,状态发生变化的函数
  3. 返回指向静态变量的指针的函数
  4. 调用线程不安全的函数

常见不可以重入的情况

  1. 调用了malloc/free函数,因为malloc函数是用全局链表管理的
  2. 调用了标准的I/O库函数,标准I/O库的实现都是以不可重入的方式使用全局数据结构

 常见可重入的情况

  • 不使用全局变量或静态变量
  • 不使用malloc或者new开辟出来的空间
  • 不调用不可重入函数
  • 不返回静态或全局数据,所有数据都由函数的调用者提供
  • 使用本地数据,或者通过制作全局数据本地拷贝来保护全局数据

可重入与线程安全联系

  • 函数是可重入的,那线程就是安全的
  • 函数是不可重入的,那不能多个线程使用,有可能引发线程安全
  • 如果函数有全局变量,那么函数既不是线程安全的也不是可重入的
  • 可重入函数是线程安全的一种
  • ‘线程安全不一定是可重入的,但是可重入的一定是线程安全的
  • 如果对临界资源上锁,那么这个函数是线程安全的,但是如果这个函数的锁没有被释放会产生死锁,因此是不可重入的

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

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

相关文章

NXP Smart Access Car-车用产品整合应用

在汽车技术不断进步的今天,智能化已成为汽车行业发展的主要趋势之一。本次研讨会将深入探讨NXP的Smart Access Car技术,说明如何通过NXP 产品设计提升汽车的安全性、便利性和使用者体验。研讨会将涵盖NXP MCU/NFC等方面的最新解决方案,并探讨…

Qt调用Yolov11导出的Onnx分类模型开发分类检测软件

软件视频地址:视频地址 代码开源地址 之前用Python配合YOLOV11开发一个了分类训练软件,软件只要准备好数据,然后导入就可以训练数据,训练完成后还可以验证,测试,但是要真正落地,还是有点欠缺。配合YOLOV1…

入门数据结构JAVADS——如何通过遍历顺序构建二叉树

目录 前言 构建二叉树的前提: 为什么需要两个不同类型的遍历: 前序遍历 中序遍历 我们的算法思路如下: 举例: 代码实现 后序遍历 中序遍历 结尾 前言 入门数据结构JAVA DS——二叉树的介绍 (构建,性质,基本操作等) (1)-CSDN博客 在上…

我毕业后的8年嵌入式工作

2015年毕业,2016年工作到现在已经过了8个年头,借着征文,做个简单的回顾与总结。 2015年从广州番禺职业技术学院毕业,学的是嵌入式技术与应用,我的下一届学弟学妹变物联网了,算是绝版专业了吧。出来后谨遵校…

07 设计模式-结构型模式-桥接模式

桥接(Bridge)是用于把抽象化与实现化解耦,使得二者可以独立变化。这种类型的设计模式属于结构型模式,它通过提供抽象化和实现化之间的桥接结构,来实现二者的解耦。 这种模式涉及到一个作为桥接的接口,使得…

JAVA单列集合

List系列集合:添加的元素是 有序、可重复、有索引 Set系列集合:添加的元素是 无序、不重复、无索引 Collection Collection是单列集合的接口,它的功能是全部单列集合都可以继承使用的 public boolean add(E e) 把给定的对象添加到当前集合中 public void …

Spring MVC(下)

博主主页: 码农派大星. 数据结构专栏:Java数据结构 数据库专栏:MySQL数据库 JavaEE专栏:JavaEE 关注博主带你了解更多JavaEE知识 目录 1.响应 1.1 返回静态页面 1.2 返回数据ResponseBody 1.3 返回HTML代码⽚段 1.4 返回JSON 1.5 设置状态码 1.6 设置Header 2 . …

【文献及模型、制图分享】基于国际湿地城市视角的常德市湿地保护修复成效与归因分析及其政策启示

文献介绍 《湿地公约》提出的“国际湿地城市”认证是促进湿地保护修复的新举措。以国际湿地城市常德市为例,基于2000—2022年15 m空间分辨率湿地分类数据,监测常德市湿地保护修复逐年动态变化,定量分析湿地保护修复驱动因素的重要性和贡献率…

K8s中TSL证书如何续期

TSL是什么 K8s中的作用是什么? 在 Kubernetes(K8s)中,TSL 指的是 Transport Layer Security,也就是传输层安全协议。它是用来保护在网络上传输的数据的安全性和隐私性。 TSL 在 Kubernetes 中的作用包括:…

第1讲(ASP.NET Core 6 Web Api 开发入门):第一个Web Api项目

一、运行模板项目 二、验证模板项目的api 法1:直接在网页上进行验证api 法2:通过命令行验证api 复制下图的Curl语句,打开命令行进行粘贴。(对于windows系统,需要把换成",再去掉所有的/,最…

一文了解AOSP是什么?

一文了解AOSP是什么? AOSP基本信息 基本定义 AOSP是Android Open Source Project的缩写,这是一个由Google维护的完全免费和开放的操作系统开发项目。它是Android系统的核心基础,提供了构建移动操作系统所需的基本组件。 主要特点 完全开源…

【景观生态学实验】实验一 ArcGIS地理数据处理及制图基础

实验目的 1.掌握ArcGIS软件基本操作:通过实验操作与学习,熟练掌握ArcGIS软件相关的基本操作,包括界面熟悉、工具栏使用、数据的加载和保存、基本数据处理操作等; 2.掌握如何使用ArcGIS进行影像拼接及裁剪:通过实验操作与学习&am…

传知代码-ChatGPT多模态命名实体识别

代码以及视频讲解 本文所涉及所有资源均在传知代码平台可获取 ChatGPT辅助细化知识增强! 多模态命名实体识别(MNER)最近引起了广泛关注。 用户在社交媒体上生成大量非结构化内容,主要由图像和文本组成。这些帖子具有与社交媒体相…

GISBox vs CesiumLab:哪款GIS工具更适合你的项目?

在地理信息系统(GIS)领域,越来越多的用户开始关注GIS工具箱的选择,其中GISBox和CesiumLab是两款备受推崇的产品。那么,哪一款更适合你的需求呢?本文将从功能、使用体验和应用场景等方面,对GISBo…

产品如何实现3D展示?具体步骤如下

产品实现3D展示主要依赖于先进的3D建模与展示技术。以下是产品实现3D展示的具体步骤和方法: 一、3D建模 使用专业的3D建模软件,如Blender、Maya、3ds Max等,这些软件提供了丰富的建模工具和材质编辑器,能够创建出高精度的3D模型…

Python基于amazon/chronos-t5-base的预训练模型离线对时间系列数据的未来进行预测

Python基于预训练模型对时间系列数据的未来进行预测 导入库 %matplotlib inline import matplotlib.pyplot as plt import numpy as np import pandas as pd import torch from chronos import ChronosPipeline from tqdm.auto import tqdm from autogluon.timeseries import…

电脑定期运行某个程序

1、右键计算机-管理,点击任务计划程序,再点击创建基本任务; 2、写名称,下一步 3、选择任务开始计划,下一步 4、选择触发时间,下一步 5、选择启动程序,下一步 6、选择运行的程序,下一…

模型拆解(一):DBINet、GCPANet、CPD、ACCoNet、FPS-U2Net

文章目录 一、DBINet1.1编码器模块:ResNet50PVT双分支结构1.2解码器模块:自细化模块SR的应用1.3DFM:双分支融合模块1.4转换器模块:调整编码器输出至解码器中1.5深度监督损失函数 二、GCPANet2.1编码器模块:ResNet50主干…

uniapp移动端优惠券! 附源码!!!!

本文为常见的移动端uniapp优惠券,共有6种优惠券样式(参考了常见的优惠券),文本内容仅为示例,您可在此基础上调整为你想要的文本 预览效果 通过模拟数据,实现点击使用优惠券让其变为灰色的效果(模…

来自骨关节炎计划的膝关节MR图像的自动异常感知3D骨骼和软骨分割|文献速递-基于生成模型的数据增强与疾病监测应用

Title 题目 Automated anomaly-aware 3D segmentation of bones and cartilages in kneeMR images from the Osteoarthritis Initiative 来自骨关节炎计划的膝关节MR图像的自动异常感知3D骨骼和软骨分割 Background 背景 近年来,多个机器学习算法被提出用于图像…