【Linux】可重入函数

news/2024/11/24 13:32:59/

文章目录

  • 前言
  • 一. 场景
  • 二. 可重入与线程安全
  • 结束语

前言

在Linux中,进程/线程可能因为时间片到达,或者其他中断,或者调用系统,需要从用户态切换到内核态,而内核空间会保存切换前,用户代码执行处的上下文,以便切换回用户态时,可以继续执行原来的代码。
而这样的切换是否会影响代码的执行呢?这就是可重入函数和不可重入函数的概念的产生

在这里插入图片描述

一. 场景

以下是用户态的一次执行
假如其中有一个链表头插函数的调用
在这里插入图片描述
在申请结点空间,将node1的指针指向head->next,还没作head的改变时,假如,时间片到了,或者发生了其他的中断,切换到了内核态,捕捉信号。
而信号的执行函数中也同样使用了链表头插的函数,就会再申请一个node2的空间,完成头插后,最终切换回用户态,然后继续执行用户态的链表头插的函数,还会将head->next=node1,这样node2的失效了。就发生了内存泄漏

所以有些函数是不允许执行到一半,而切换到执行流的,这类函数称为不可重入函数,反之为可重入函数

只要函数内部有和文件的交互使用了全局数据,或者有mallocnew,申请了堆数据,那都是不可重入函数
如果一个函数内部只使用局部变量,那么这个函数就可以是可重入函数

可重入/不可重入不是函数的优缺点,只是函数的特性

二. 可重入与线程安全

在多线程时,我们往往需要注意线程的互斥与同步,而也就是在多线程中,不同线程并发运行,经常出现一个线程的动作还没完成,时间片到达,不得不切换成其他线程的情况。
所以线程安全和函数是否可重入有着一定的关系


接下来我们做些总结

  • 线程安全:多个线程并发同一段代码时,不会出现不同的结果。常见对全局变量或者静态变量进行操作,并且没有锁保护的情况下,会出现问题。
  • 重入:同一个函数被不同的执行流调用,当前一个流程还没有执行完,就有其他执行流再次进入,我们称之为重入。

常见的线程不安全的情况:

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

常见的线程安全的情况:

  1. 每个线程对全局变量或者静态变量只有读取的权限,而没有写入的权限,一般来说是线程安全的
  2. 类或者接口对于线程来说是原子操作
  3. 多个线程之间的切换不会导致该接口执行结果存在二义性

常见的不可重入的情况:

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

常见的可重入的情况:

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

可重入与线程安全的联系

  1. 如果调用的函数是可重入函数,那么此时是线程安全
  2. 如果调用的函数是不可重入的,多线程访问就会引发线程安全问题
  3. 如果一个函数中有全局变量,那么这个函数既不是线程安全的,也不是可重入的
  4. 可重入函数是线程安全的一种方式,线程安全不一定是可重入的,但可重入一定是线程安全的

结束语

感谢你的阅读

如果觉得本篇文章对你有所帮助的话,不妨点个赞支持一下博主,拜托啦,这对我真的很重要。
在这里插入图片描述


http://www.ppmy.cn/news/436403.html

相关文章

6.17黄金反弹是否到顶,下周开盘如何布局

近期有哪些消息面影响黄金走势?下周黄金多空该如何研判? ​黄金消息面解析:黄金周五(6月16日)小幅收高,但在触及5月以来最低盘中水准后本周以下跌收官。美市尾盘,现货黄金收报1957.68美元/盎司,下跌0.19美…

FPGA开发板XILINX-K7核心板Kintex7 XC7K325 410T工业级

FPGA开发板XILINX-K7核心板Kintex7 XC7K325 410T工业级 板卡更多资料可以家:fpgamdy 领取说明书和网盘资料

海康威视工业相机IP设置说明

整理电脑文件时翻到的,记录下来方便以后查阅。 第一步.先修改本机IP步骤如下: 1.打开本地连接 2.点击属性 3.选择协议—>>点击属性 4.选择使用下面IP地址 5.自己设置IP地址,然后点击确认 第二步.先修改本机IP步骤如下: 1.…

商业级、工业级、军品级、宇航级CPU有着不同标准

不仅要应对极端苛刻的高温和低温,还要能应对无处不在的宇宙辐射。 商业级、工业级、军品级、宇航级CPU有着不同标准。由于各种测试非常多,数据指标也非常细,这里仅就工作温度做罗列: 商业级CPU的工作温度为0℃~70℃。…

工业级POE交换机、企业级交换机、普通交换机之间各区别?

工业级POE交换机与普通交换机有何区别?POE工业级交换机与普通交换机的区别就是,POE工业级交换机除了能提供普通交换机所具有的传输功能,还能给网线的另一端设备提供供电功能。例如,有一台数字监控摄像机(需要供电才能正…

计算机专业如何晋级正高级,已有软考高级证书如何获得正高级职称?

我来回答下这个问题。 据人力资源社会保障部、工业和信息化部联合正式发布的《关于深化工程技术人才职称制度改革的指导意见》,软考高级对应的就是高级工程师。指导意见中的所有专业技术资格考试中,只有计算机软考,才是以考代评的高级职称。其…

nb信号和4g信号_工业级NB-IoT和4G DTU区别分析

3、数据传输稳定性高 NB-IoT直接部署于GSM/LTE网络,但不占用现有网络的语音和数据带宽,保证传统业务和未来物联网业务可同时稳定、可靠的进行。以智能抄表应用为例,PLC抄表数据回收成功率在60%左右,而NB-IoT可以提升至99%。 4、维…

电子元器件级别,工业级、商用级、汽车级、军用级之间有什么区别?

1. 工作温度范围 工作温度范围上最容易看出电子元器件级别的区别。更宽的温度范围代表着芯片的各种参数在工作温度方位内都要达标。同时,为了实现更宽的温度范围,往往需要在芯片制造工艺、功耗、封装工艺等各方面做出改变。可谓是四两拨千斤。 军工级&…