首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

重入函数

Linux下常见重入函数: POSIX.1-20001标准规定,所有的标准库函数都必须是重入函数,除了以下这些: 文章目录 重入函数 不可重入函数的特点 如何写出重入函数 上面是两张重入函数函数表...,那,什么是重入函数呢?...重入函数 重入函数主要用于多任务环境中,一个重入函数简单来说就是可以被中断的函数,也就是说,可以在这个函数执行的任何时刻中断它,转入OS调度下去执行另外一段代码,而返回控制时不会出现什么错误;而不可重入函数由于使用了一些系统资源...,标准I/O库的很多实现都是以不可重入的方式使用全局的数据结构 (3)重入体内使用了静态的数据结构 ---- 如何写出重入函数 1.不在函数内部使用静态或全局变量 2.不返回静态或全局变量,所有数据都有函数的调用者提供...重入函数在并行运行环境中非常重要,但是一般要为访问全局变量付出一些性能代价。 编写重入函数时,若使用全局变量,则应通过关中断、信号量(即P、V操作)等手段对其加以保护。

34220

Linux并发(函数重入性)

重入函数是并发编程中必须要考虑的问题,否则代码就会有隐患,更糟糕的是这些隐患往往只能在特定场景下才能复现。...拓展: 一个函数所谓的重入性,是在多线程的语境下的概念:一个函数如果同时被多条线程调用,他返回的结果都是严格一致的,那么该函数被称为“重入函数(reentrance funciton),否则被称为...“不可重入函数。...二是因为函数内部调用了其他不可重入函数。 三是因为函数执行结果与某硬件设备相关。...从这点出发,如果你想要写一个线程安全的重入函数的话,只要遵循以下原则就行了: A) 不使用任何静态数据,只使用局部变量或者堆内存。 B) 不调用上表中的任何非线程安全的不可重入函数

1.3K40
您找到你想要的搜索结果了吗?
是的
没有找到

关于重入函数

,这里直接导致嵌入式 linux 系统应用进程中的所有线程停掉,进而导致看门狗进程得不到喂狗,设备重启。...那什么是不可重入函数呢? 为什么中断处理函数不能直接调用不可重入函数? 怎样写重入函数? 就以上三个问题展开小短文: 2 什么是不可重入函数?...重入函数主要用于多任务环境中,一个重入函数简单来说就是可以被中断的函数,也就是说,可以在这个函数执行的任何时刻中断它,转入 OS 调度下去执行另外一段代码,而返回控制时不会出现什么错误;而不可重入函数由于使用了一些系统资源...在多任务系统下,中断可能在任务执行的任何时间发生;如果一个函数的执行期间被中断后,到重新恢复到断点进行执行的过程中,函数所依赖的环境没有发生改变,那么这个函数就是重入的,否则就不可重入。...总而言之,中断处理函数做的事情越简单越好。 4 如何写出重入函数? 在函数体内不访问那些全局变量; 如果必须访问全局变量,记住利用互斥信号量来保护全局变量。

68010

C语言重入函数和不可重入函数

那么什么是重入函数呢?所谓重入是指一个可以被多个任务调用的过程,任务在 调用时不必担心数据是否会 出错。不可重入函数在实时系统设计中被视为不安全函数。...或者调用该函数前关中断,调用后再开中断。 重入函数可以被一个以上的任务调用,而不必担心数据被破坏。重入函数任何时候都可以被中断,一段时间以后又可以运行,而相应的数据不会丢失。...重入函数或者只使用局部变量,即保存在CPU寄存器中或堆栈中;或者使用全局变量,则要对全局变量予以保护。 说法2: 一个重入函数简单来说,就是:可以被中断的函数。...把一个不可重入函数变成重入的唯一方法是用重入规则来重写他。 其实很简单,只要遵守了几条很容易理解的规则,那么写出来的函数就是重入的。 第一,不要使用全局变量。...把一个不可重入函数变成重入的唯一方法是用重入规则来重写他。 其实很简单,只要遵守了几条很容易理解的规则,那么写出来的函数就是重入的。 第一,不要使用全局变量。

3.3K30

C语言(重入函数

综上所述的函数行为总结一个概念就是:在多次调用中(不管是否同时)行为变现一致的函数,被称为重入函数,否则被称为不可重入函数。...POSIX.1-20001标准规定,所有的标准库函数都必须是重入函数,除了以下这些: ?...二是因为函数内部调用了其他不可重入函数。 三是因为函数执行结果与某硬件设备相关。...从这点出发,如果你想要写一个线程安全的重入函数的话,只要遵循以下原则就行了: A) 不使用任何静态(老不死)数据,只使用局部变量或者堆内存。 B) 不调用上表中的任何非线程安全的不可重入函数。...如果不能同时满足以上两个条件,可以使用信号量、互斥锁等机制来确保使用静态数据或者调用不可重入函数时的互斥效果。其实,这也是编写多线程程序必须要注意的地方啦!

2.3K40

c语言重入函数_c语言不可重入函数有哪些

什么是重入函数 重入函数指一个同时被多个任务调用的过程,当一个函数满足下列条件时多为不可重入函数 (1)函数中使用了静态的数据结构; (2)函数中使用了malloc()、free()函数; (3...)函数汇总调用了标准I/O函数。...(如open、read、write、close等系统调用) 如何编写重入函数 (1)编写重入函数时,不应使用static局部变量,应使用auto即缺省态局部变量或寄存器变量。...不可重入函数示例: //Num为int型全局变量,函数Inc_Num返回Num加1的值 unsigned int example(int value) { unsigned int tmp;...Num = value; tmp = Inc_Num(); return tmp; } 重入示例: //Num为int型全局变量,函数Inc_Num返回Num加1的值 unsigned

79440

重入函数 VS 线程安全

,而没有写入的权限,一般来说这些线程是安全的 类或者接口对于线程来说都是原子操作 多个线程之间的切换不会导致该接口的执行结果存在二义性 二、重入函数 一个函数重入的情况下,运行结果不会出现任何不同或者任何问题...,则该函数被称为重 入函数,否则,是不可重入函数。...常见不可重入的情况 调用了malloc/free函数,因为malloc函数是用全局链表来管理堆的 调用了标准I/O库函数,标准I/O库的很多实现都以不可重入的方式使用全局数据结构 重入函数体内使用了静态的数据结构...三、重入与线程安全 重入与线程安全联系 函数重入的,那就是线程安全的 函数是不可重入的,那就不能由多个线程使用,有可能引发线程安全问题 如果一个函数中有全局变量,那么这个函数既不是线程安全也不是重入的...重入与线程安全区别 重入函数是线程安全函数的一种。 线程安全不一定是重入的,而重入函数则一定是线程安全的。

12120

Linux系统下读取目录操作及重入函数介绍

一、读取目录下的子文件: 1、在Linux系统下,打开和读取目录下的子文件主要是用opendir与readdir函数来操作的,我们解析一下这两个函数的原型: a、opendir函数: #include...二、重入函数介绍: 1、在实时系统的设计中,经常会出现多个任务调用同一个函数的情况。...相反,肯定有一个安全的函数,这个安全的函数又叫重入函数。那么什么是重入函数呢?所谓重入是指一个可以被多个任务调用的过程,任务在调用时不必担心数据是否会出错。...重入函数在并行运行环境中非常重要,但是一般要为访问全局变量付出一些性能代价。 编写重入函数时,若使用全局变量,则应通过关中断、信号量(即P、V操作)等手段对其加以保护。...保证函数重入性的方法: 1)在写函数时候尽量使用局部变量(例如寄存器、堆栈中的变量); 2)对于要使用的全局变量要加以保护(如采取关中断、信号量等互斥方法),这样构成的函数就一定是一个重入函数

1.6K10

C语言 | C++重入函数

,这里直接导致嵌入式 linux 系统应用进程中的所有线程停掉,进而导致看门狗进程得不到喂狗,设备重启。...那什么是不可重入函数呢? 为什么中断处理函数不能直接调用不可重入函数? 怎样写重入函数? 就以上三个问题展开小短文: 2 什么是不可重入函数?...重入函数主要用于多任务环境中,一个重入函数简单来说就是可以被中断的函数,也就是说,可以在这个函数执行的任何时刻中断它,转入 OS 调度下去执行另外一段代码,而返回控制时不会出现什么错误;而不可重入函数由于使用了一些系统资源...在多任务系统下,中断可能在任务执行的任何时间发生;如果一个函数的执行期间被中断后,到重新恢复到断点进行执行的过程中,函数所依赖的环境没有发生改变,那么这个函数就是重入的,否则就不可重入。...总而言之,中断处理函数做的事情越简单越好。 4 如何写出重入函数? 在函数体内不访问那些全局变量; 如果必须访问全局变量,记住利用互斥信号量来保护全局变量。

1.4K88

重入分析

重入分析 1. 什么是“重入” 2. 可能出现重入问题的接口 2.1 单个网络调用 2.2 多段网络调用 2.3 有状态接口 3. 重入保证的关键场景 4....什么是“重入” 一般情况下,重入指的是接口(函数)可以重复调用且不发生异常。 个人认为,与幂等相比,重入是一个业务概念。...比如登录接口,第一次登录成功后进行重复登录,若返回“登录成功”此时是幂等的(也是重入的),若返回“您已登录”此时是重入的但非幂等。 个人觉得没必要纠结幂等与重入的概念细节差异。...注:重入问题和不可重入问题和重入问题,都是同一个问题,都是指:可能存在不可重入的情况,但是想要保证重入。 2....必定重入: 无数据变更(幂等接口)必定重入 必定不可重入: 存在多段网络调用进行数据变更的接口,前段逻辑的返回值受数据变化影响,且该数据会被当前接口修改(重入时可能出现后段逻辑不可达的情况)

73520

Linux进程信号(产生、保存、处理)重入函数概念volatile理解SIGCHLD信号

首先区分一下Linux信号跟进程间通信中的信号量,它们的关系就犹如老婆跟老婆饼一样,没有一毛钱的关系。 信号的概念 信号的概念:信号是进程之间事件异步通知的一种方式,属于软中断。...学习Linux进程信号,我们学习的是信号的预备知识+信号是如何产生的+信号是如何保存的+如何处理信号,即信号的整个生命周期。...\n"); sleep(1); } return 0; }  重入函数概念 拿链表的插入操作举例子。...因此,对于像insert这样的函数一旦重入,就可能会导致问题的,表示该函数不可重入。而如果某个函数重入后,没有问题发生,表示该函数重入。...不可重入的情况: ①调用了malloc或free,因为malloc也是用全局链表来管理堆的。 ②调用了标准I/O库函数。标准I/O库的很多实现都以不可重入的方式使用全局数据结构。

1.4K10

重入函数对于线程安全的意义(附函数表)

重入函数的分类 (1)显式重入函数 如果所有函数的参数都是传值传递的(没有指针),并且所有的数据引用都是本地的自动栈变量(也就是说没有引用静态或全局变量),那么函数就是显示重入的,也就是说不管如何调用...(2)隐式重入函数 重入函数中的一些参数是引用传递(使用了指针),也就是说,在调用线程小心地传递指向非共享数据的指针时,它才是重入的。...重入函数可以在任意时刻被中断,稍后再继续运行,不会丢失数据,重入函数要么使用本地变量,要么在使用全局变量时保护自己 的数据。 为什么 为什么有的函数重入,又有的函数不可重入?...举例 Linux下常见重入函数 ? 上面那个不够满足的话,看下面这个: POSIX.1-20001标准规定,所有的标准库函数都必须是重入函数,除了以下这些: ?...(2)、线程安全是在多个线程情况下引发的,而重入函数可以在只有一个线程的情况下来说。 (3)、线程安全不一定是重入的,而重入函数则一定是线程安全的。

2.5K20

linux系统编程之基础必备(六):重入函数、线程安全、volatile

以上三者的关系为:重入函数 必然 是 线程安全函数 和 异步信号安全函数; 线程安全函数不一定是重入函数。...重入与线程安全的区别体现在能否在signal处理函数中被调用的问题上,重入函数在signal处理函数中可以被安全调用,因此同时也是Async- Signal-Safe Function;而线程安全函数不保证可以在...也就是说函数如果使用静态变量,通过加锁后可以转成线程安全函数,但仍然有可能不是重入的。我们所熟知的malloc 也是线程安全但不是 重入的。        ...反之,如果一个函数只访问自己的局部变量或参数,则称为重入(Reentrant)函数。...参考: 《linux c 编程一站式学习》

1.3K20

Java不可重入锁和重入锁理解

最近正在阅读Java ReentrantLock源码,始终对重入和不可重入概念理解不透彻,进行学习后记录在这里。...wait():阻塞当前线程 notify():唤起被wait()阻塞的线程 不可重入锁 所谓不可重入锁,即若当前线程执行某个方法已经获取了该锁,那么在方法中尝试再次获取锁时,就会获取不到被阻塞。...我们尝试设计一个不可重入锁: ? 使用该锁: ? 当前线程执行print()方法首先获取lock,接下来执行doAdd()方法就无法执行doAdd()中的逻辑,必须先释放锁。...这个例子很好的说明了不可重入锁。 重入锁 接下来,我们设计一种重入锁 ? 所谓重入,意味着线程可以进入它已经拥有的锁的同步代码块儿。...重入锁的概念和设计思想大体如此,Java中的重入锁ReentrantLock设计思路也是这样

1.9K11

java重入锁与不可重入

所谓重入锁,指的是以线程为单位,当一个线程获取对象锁之后,这个线程可以再次获取本对象上的锁,而其他的线程是不可以的。 synchronized 和 ReentrantLock 都是重入锁。...重入锁的意义在于防止死锁。 实现原理是通过为每个锁关联一个请求计数器和一个占有它的线程。...重入锁: 接下来,我们设计一种重入锁 public class Lock{ boolean isLocked = false; Thread lockedBy = null;...重入锁的概念和设计思想大体如此,Java中的重入锁ReentrantLock设计思路也是这样。 synchronized和ReentrantLock 都是重入锁。...摘自:JAVA重入锁与不可重入锁 和 Java不可重入锁和重入锁理解 发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/153277.html原文链接:https

91820
领券