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

8540

重入函数

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

14420
  • 广告
    关闭

    2022腾讯全球数字生态大会

    11月30-12月1日,邀您一起“数实创新,产业共进”!

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

    关于重入函数

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

    31210

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

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

    1.9K30

    C语言(重入函数

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

    1.7K40

    socket常用函数_socket是重入函数

    前言 socketpair是Linux下的函数,其主要作用是创建一对套节字来进行进程间通信,其与匿名管道(PIPE)的作用相似,这两个套节字均可读可写. 如发现本站涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

    6230

    C语言 | C++重入函数

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

    46188

    Linux并发(函数重入性)

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

    72940

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

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

    1.4K20

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

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

    71620

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

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

    24010

    sql 聚合函数哪些

    聚合函数是对一组值执行计算并返回单一的值的函数,它经常与SELECT语句的GROUP BY子句一同使用,SQL SERVER 中具体哪些聚合函数呢?我们来一一看一下: 1. COUNT_BIG 返回指定组中的项目数量,与COUNT函数不同的是COUNT_BIG返回bigint值,而COUNT返回的是int值。

    8420

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

    以上三者的关系为:重入函数 必然 是 线程安全函数 和 异步信号安全函数; 线程安全函数不一定是重入函数重入与线程安全的区别体现在能否在signal处理函数中被调用的问题上,重入函数在signal处理函数中可以被安全调用,因此同时也是Async- Signal-Safe Function;而线程安全函数不保证可以在 也就是说函数如果使用静态变量,通过加锁后可以转成线程安全函数,但仍然可能不是重入的。我们所熟知的malloc 也是线程安全但不是 重入的。         像上例这样,insert函数被不同的控制流程调用, 可能在第一次调用还没返回时就再次进入该函数,这称为重入,insert函数访问一个全局链表,可能因为重入而造成错乱,像这样的函数称为不可重 入函数, 反之,如果一个函数只访问自己的局部变量或参数,则称为重入(Reentrant)函数

    79110

    【说站】php数组函数哪些

    php数组函数哪些 推荐操作系统:windows7系统、PHP5.6、DELL G3电脑 1、数组的分段和填充 array_slice($arr,0,3);  可以将数组中的一段取出,此函数忽略键名 array_splice($arr,0,3,array("black","maroon"));  可以将数组中的一段取出,与上个函数不同在于返回的序列从原数组中删除 2、分割多个数组 array_chunk ($arr,3,TRUE);  可以将一个数组分割成多个,TRUE为保留原数组的键名 3、数组的填充 array_pad($arr,5,'x');  将一个数组填补到制定长度 4、数组排序函数 sort 以升序对关联数组进行排序 arsort() - 根据值,以降序对关联数组进行排序 krsort() - 根据键,以降序对关联数组进行排序 在数组的操作中,我们可以把常见的问题归纳为增改删差、排除等处理的方法,其中有许多函数可以结合数组一同进行操作 以上就是php数组函数的介绍,对于一些常见的函数,比如排序等都是要求新手必须掌握的,大家在熟悉了基本的函数用法后,就可以展开有关数组方面的练习。

    8220

    c语言反三角函数哪些,反三角函数公式哪些

    7、当x∈[—π/2,π/2]时,arcsin(sinx)=x。8、当x∈〔0,π〕,arccos(cosx)=x。9、x∈(—π/2,π/2),arctan(tanx)=x。 反三角函数是一种基本初等函数。 三角函数的反函数是个多值函数,因为它并不满足一个自变量对应一个函数值的要求,其图像与其原函数关于函数 y=x 对称。欧拉提出反三角函数的概念,并且首先使用了“arc+函数名”的形式表示反三角函数。 反三角函数(inverse trigonometric function)是一类初等函数。指三角函数的反函数,由于基本三角函数具有周期性,所以反三角函数是多值函数。 这种多值的反三角函数包括:反正弦函数、反余弦函数、反正切函数、反余切函数、反正割函数、反余割函数,分别记为Arcsin x,Arccos x,Arctan x,Arccot x,Arcsec x,Arccsc

    38110

    【说站】python哪些高级内置函数

    python哪些高级内置函数 1、enumerate返回针对序列类型的迭代对象的枚举对象。 2、eval取出字符串中的内容。 将str中有效的表达式返回计算结果。 1, 2, 3, 4]   def demo(x):     return x*10   list8 = [i for i in range(7)] s = map(demo,list8)#数据必须是迭代数据 , ('yes', '是的'), ('no', '不')] # print(dict(list12))#{'ok': '可以', 'yes': '是的', 'no': '不'} #可以直接转换成字典,对象就配对 ,没有就不配 以上就是python高级内置函数的介绍,希望对大家有所帮助。

    8320

    【说站】python哪些数组叠加函数

    python哪些数组叠加函数 1、hstack代表水平方向叠加,要想叠加成功,行必须一致。 2、vstack代表垂直方向叠加。如果叠加成功,列必须一致。 array([[6, 9, 5, 0],        [6, 1, 9, 4],        [8, 8, 9, 8],        [2, 3, 5, 5]])''' 以上就是python数组叠加函数的介绍

    5820

    正在直播:云函数哪些趣味玩法?

    直播主题 云函数的趣味玩法 直播时间 1月27日(周三) 晚19:00 观看直播 视频号 Bilibili ?

    28110

    【说站】python Pool常用函数哪些

    python Pool常用函数哪些 说明 1、apply_async(func[,args[,kwds]):使用非堵塞调用func(并行执行,堵塞方式必须等待上一个过程退出才能执行下一个过程),args pool.close()     pool.join()   #调用join之前,先调用close函数,否则会出错。 执行完close后不会有新的进程加入到pool,join函数等待所有子进程结束     print("Sub-process(es) done.") 以上就是python Pool常用函数的介绍,希望对大家有所帮助。

    5510

    【说站】python集合魔法函数哪些

    python集合魔法函数哪些 说明 1、_len_调用len()方法时,就是调用对象内的_len_()方法 2、_getitem_调用object[item]方法时,就是调用对象内的_getitem name"]) del testContainer["name"] print(testContainer["name"]) print(1 in testContainer) 以上就是python集合魔法函数的介绍

    8230

    扫码关注腾讯云开发者

    领取腾讯云代金券