首页
学习
活动
专区
工具
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...如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

83040

可重入函数

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

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

    关于可重入函数

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

    73710

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

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

    3.6K30

    C语言(可重入函数)

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

    2.4K40

    可重入函数 VS 线程安全

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

    19020

    C语言 | C++可重入函数

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

    1.5K88

    Linux并发(函数的可重入性)

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

    1.3K40

    Linux C库函数的可重入与不可重入版本说明

    C标准库中的很多函数都存在可重入(Reentrant)和不可重入版本。...在这些函数的命名上,不可重入的函数名称通常是简单的函数名,而可重入版本的函数名称后面通常带有 _r,表示该函数是设计为可重入的版本。...可重入函数:可重入函数在设计上避免了共享状态的问题,它们通常只使用局部变量,或者通过传递上下文指针来存储状态,这样每个线程都拥有自己的副本,避免了竞争条件。...需要强调的是,可重入函数并不一定就是线程安全的,虽然它们之间有很大的重叠。 例如,函数如果只使用局部变量而不依赖全局状态,它通常是可重入的,但并不一定是线程安全的,特别是在函数内部涉及到系统调用时。...可重入函数:可重入函数在每次调用时不会依赖外部状态(如全局变量、静态变量),即便是在中断上下文中或多个线程并发执行时,它也能安全执行。

    8710

    可重入分析

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

    89120

    【linux学习指南】可重入函数与volatile

    可重⼊函数 main函数调⽤insert函数向⼀个链表head中插⼊节点node1,插⼊操作分为两步,刚做完第⼀步的时候,因为硬件中断使进程切换到内核,再次回⽤⼾态之前检查到有信号待处理,于是切换到sighandler...像上例这样,insert函数被不同的控制流程调⽤,有可能在第⼀次调⽤还没返回时就再次进⼊该函数,这称为重⼊,insert函数访问⼀个全局链表,有可能因为重⼊⽽造成错乱,像这样的函数称为不可重⼊函数,反之...,如果⼀个函数只访问⾃⼰的局部变量或参数,则称为可重⼊(Reentrant)函数。...这两个控制流程对func的调用不会相互干扰,因为它们操作的是各自栈帧中的参数和局部变量,从而体现了可重入函数访问自己的局部变量或参数不会造成错乱的特性。...减少函数调用开销,例如对一些简单的函数(如内联函数)进行适当优化,提高执行效率。 适用场景: 当对编译速度要求较高,且对程序性能提升有一定需求,但不希望过度优化时可以使用。

    10610

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

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

    2.8K20

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

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

    1.9K11

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

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

    1.6K20
    领券