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

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

什么是重入函数 重入函数指一个同时被多个任务调用的过程,当一个函数满足下列条件时多为不可重入函数 (1)函数中使用了静态的数据结构; (2)函数中使用了malloc()、free()函数; (3...(如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...如发现本站涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

79040

重入函数

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

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

关于重入函数

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

67510

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

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

3.3K30

C语言(重入函数

大家都写过C语言中的函数,但有没有想过,你编写的函数在同一个时刻是否允许被多个调用者调用呢?是不是不管谁来调用,多少个调用者同时调用,都能给出一致的表现,返回一致的结果?...综上所述的函数行为总结一个概念就是:在多次调用中(不管是否同时)行为变现一致的函数,被称为重入函数,否则被称为不可重入函数。...POSIX.1-20001标准规定,所有的标准库函数都必须是重入函数,除了以下这些: ?...正如其名所提示的,我们在程序中,同时调用这些函数可能会产生不一致的结果,产生这样结果的原因三,上面已经提到,用比较官方严肃的语言来表述如下: 一是因为函数内部使用了共享资源,比如全局变量、环境变量。...从这点出发,如果你想要写一个线程安全的重入函数的话,只要遵循以下原则就行了: A) 不使用任何静态(老不死)数据,只使用局部变量或者堆内存。 B) 不调用上表中的任何非线程安全的不可重入函数

2.3K40

重入函数 VS 线程安全

前言:在多线程的初步学习中,两个概念时常被一起提到,是否重入与线程是否安全,由于这两者一定的关联性,就有部分的同学将其混为一谈。...,则该函数被称为重 入函数,否则,是不可重入函数。...常见不可重入的情况 调用了malloc/free函数,因为malloc函数是用全局链表来管理堆的 调用了标准I/O库函数,标准I/O库的很多实现都以不可重入的方式使用全局数据结构 重入函数体内使用了静态的数据结构...三、重入与线程安全 重入与线程安全联系 函数重入的,那就是线程安全的 函数是不可重入的,那就不能由多个线程使用,可能引发线程安全问题 如果一个函数中有全局变量,那么这个函数既不是线程安全也不是重入的...重入与线程安全区别 重入函数是线程安全函数的一种。 线程安全不一定是重入的,而重入函数则一定是线程安全的。

12020

Linux并发(函数重入性)

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

1.3K40

C语言 | C++重入函数

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

1.4K88

重入分析

重入分析 1. 什么是“重入” 2. 可能出现重入问题的接口 2.1 单个网络调用 2.2 多段网络调用 2.3 状态接口 3. 重入保证的关键场景 4....什么是“重入” 一般情况下,重入指的是接口(函数)可以重复调用且不发生异常。 个人认为,与幂等相比,重入是一个业务概念。...注:重入问题和不可重入问题和重入问题,都是同一个问题,都是指:可能存在不可重入的情况,但是想要保证重入。 2....其次就是引入分布式事务(参考网上方案)。 2.3 状态接口 状态接口可分为“内存有状态接口”和“持久化状态接口”。 内存有状态接口指的是状态保存在内存中,比如类的静态属性。...持久化状态接口指的是状态保存在外部存储中,比如mysql中存着订单付款状态。

72920

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

重入函数的分类 (1)显式重入函数 如果所有函数的参数都是传值传递的(没有指针),并且所有的数据引用都是本地的自动栈变量(也就是说没有引用静态或全局变量),那么函数就是显示重入的,也就是说不管如何调用...(2)隐式重入函数 重入函数中的一些参数是引用传递(使用了指针),也就是说,在调用线程小心地传递指向非共享数据的指针时,它才是重入的。...重入函数可以多余一个任务并发使用,而不必担心数据错误,相反,不可重入函数不能由超过一个任务所共享,除非能确保函数的互斥(或者使用信号量,或者在 代码的关键部分禁用中断)。...重入函数可以在任意时刻被中断,稍后再继续运行,不会丢失数据,重入函数要么使用本地变量,要么在使用全局变量时保护自己 的数据。 为什么 为什么有的函数重入,又有的函数不可重入?...为什么重入 一个重入函数可以被多个执行流重复进入,内部使用的数据都应该来自于自身的栈空间,包括返回值也不应该是全局或者静态的,可以允许函数的多个副本在运行,而正是因为其中的操作数据都来自于自身的栈空间

2.5K20

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

最近正在阅读Java ReentrantLock源码,始终对重入和不可重入概念理解不透彻,进行学习后记录在这里。...基础知识 Java多线程的wait()方法和notify()方法 这两个方法是成对出现和使用的,要执行这两个方法,一个前提就是,当前线程必须获其对象的monitor(俗称“锁”),否则会抛出IllegalMonitorStateException...wait():阻塞当前线程 notify():唤起被wait()阻塞的线程 不可重入锁 所谓不可重入锁,即若当前线程执行某个方法已经获取了该锁,那么在方法中尝试再次获取锁时,就会获取不到被阻塞。...这个例子很好的说明了不可重入锁。 重入锁 接下来,我们设计一种重入锁 ? 所谓重入,意味着线程可以进入它已经拥有的锁的同步代码块儿。...重入锁的概念和设计思想大体如此,Java中的重入锁ReentrantLock设计思路也是这样

1.8K11

重入锁和不可重入锁的区别

不可重入锁示例(同一个线程不可以重入上锁后的代码段) 如下是一个不可重入锁的逻辑过程,会发现执行main方法控制台会打印执行doJob方法前,然后就会一直线程阻塞,不会打印执行doJob方法过程中,原因在于第一次上锁后...isLocked = false; // 将这个值设置为false目的是释放锁 notify(); // 接触阻塞 } } 重入锁示例...(同一个线程可以重入上锁的代码段,不同的线程则需要进行阻塞) java的重入:ReentrantLock(显式的重入锁)、synchronized(隐式的重入锁) 重入锁诞生的目的就是防止上面不可重入锁的那种情况...,导致同一个线程不可重入上锁代码段。...设计重入锁的示例代码 public class MyReentrantLock { boolean isLocked = false; // 默认没有上锁 Thread

43110

使用重入函数进行更安全的信号处理

由于信号在本质上是异步的,所以难以找出当信号处理函数触发某个不可重入函数时导致的 bug。 本文: 定义了重入性,并包含一个重入函数的 POSIX 清单。...给出了示例,以说明不可重入性所导致的问题。 指出了确保底层函数重入性的方法。 讨论了在编译器层次上对重入性的处理。 什么是重入性?...重入函数可以在任意时刻被中断,稍后再继续运行,不会丢失数据。重入函数要么使用本地变量,要么在使用全局变量时保护自己的数据。 重入函数: 不为连续的调用持有静态数据。...对标准程序库而言,很多程序库函数在固定的对象中返回值,总是重复使用同一对象,这就使得那些函数不可重入。 近来很多提供商已经开始提供标准 C 程序库的重入版本,这是一个好消息。...,因为它们使用静态数据结构来记录哪些内存块是空闲的。

1.5K20

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

二、重入函数介绍: 1、在实时系统的设计中,经常会出现多个任务调用同一个函数的情况。...相反,肯定有一个安全的函数,这个安全的函数又叫重入函数。那么什么是重入函数呢?所谓重入是指一个可以被多个任务调用的过程,任务在调用时不必担心数据是否会出错。...也可以这样理解,重入即表示重复进入,首先它意味着这个函数可以被中断,其次意味着它除了使用自己栈上的变量以外不依赖于任何环境(包括 static),这样的函数就是purecode(纯代码)重入,可以允许函数的多个副本在运行...重入函数在并行运行环境中非常重要,但是一般要为访问全局变量付出一些性能代价。 编写重入函数时,若使用全局变量,则应通过关中断、信号量(即P、V操作)等手段对其加以保护。...保证函数重入性的方法: 1)在写函数时候尽量使用局部变量(例如寄存器、堆栈中的变量); 2)对于要使用的全局变量要加以保护(如采取关中断、信号量等互斥方法),这样构成的函数就一定是一个重入函数

1.6K10
领券