不可重入函数汇总 递归函数在内存只有一份拷贝,但按这样理解递归是错误的。是吗?
递归函数在内存只有一份拷贝,但按这样理解递归是错误的。是吗?
谢谢。首先,递归函数代码只需要在内存中有一个副本,通常只有一个副本。
其次,这种理解只与编程语言和计算机体系结构的实现有关,与递归无关。
以C为例,函数的实现代码通常存储在文本部分,函数的每次调用都会在堆栈部分生成一个新的堆栈帧,其中存储了该调用的上下文、局部变量等信息,函数返回时释放该数据。
如果递归深度太大,堆栈空间不足以存储这些调用生成的数据,则很容易发生堆栈溢出错误。
递归调用:内存中只需要函数代码的一个副本;而当函数运行时,动态数据可能有多个副本。
什么是可重入函数?
可重入函数:主要用于多任务环境。可重入函数只是一个可以中断的函数。换言之,当函数被执行时,它可以在任何时候被中断,然后转移到操作系统调度以执行另一段代码。返回控件时不会出错。
什么是C语言的可重入函数?怎么使用?
字面意思是您可以重复输入。可重入性是多任务系统中的一个概念,它意味着该函数在运行到任何位置时都可以被中断以执行其他任务,并且返回时不会出错。当我们同时处理多个任务时,为什么会有这个概念呢。我举个例子。我们定义了一个名为func的函数和两个线程。两个线程都调用func。情况就是这样。当线程1执行func时,线程2开始执行func。结果,两个线程都执行了两次func。在正常情况下,两个线程都可以成功执行,并且没有错误。我们认为func是一个可重入函数。但是,如果func使用一个公共资源,例如读取同一个文件或访问同一个全局变量,则当两个线程访问公共资源时,会导致冲突。这样的函数是不可重入的。
单片机C语言设计里说的可重入函数是什么?和不可重入函数的区别是什么?
1、可重入函数
1)什么是可重入函数?
可重入函数可由多个任务同时使用,无需担心数据错误。相反,非可重入函数不能由多个任务共享,除非它们相互排斥(或者使用信号量,或者在代码的关键部分禁用中断)。可重入函数可以随时中断,以后继续运行而不会丢失数据。可重入函数要么使用局部变量,要么在使用全局变量时保护其数据。
2)可重入函数:
不保留连续调用的静态数据。
不返回指向静态数据的指针;所有数据由函数的调用者提供。
通过使用本地数据或制作全局数据的本地副本来保护全局数据。
如果必须访问全局变量,请记住使用互斥信号量保护它们。
切勿调用任何不可重入函数。
3)不可重入函数:
函数中使用静态变量,无论是全局变量还是局部变量。
函数返回一个静态变量。在函数中调用不可重入的函数。
在函数体中使用静态数据结构;
在函数体中调用malloc()或free()函数;
在函数体中调用其他标准I/O函数。
函数是单例中的成员函数,它使用的成员变量不是由线程独立存储的。
通常,如果函数在重入条件下使用未受保护的共享资源,则该函数不可重入
版权声明:本文内容由互联网用户自发贡献,本站不承担相关法律责任.如有侵权/违法内容,本站将立刻删除。