首页 > 编程知识 正文

什么是可重入函数,c语言可重入函数有哪些

时间:2023-05-05 16:52:35 阅读:190233 作者:4923

线程安全:简单来说,线程安全是指线程安全的,因为当多个线程同时执行同一代码时,不会出现不同的结果。

3358 www.Sina.com/http://www.Sina.com/:原因往往是针对全局变量和静态变量的操作。

线程安全产生的

)1)不保护共享变量的函数

)2)随着函数状态的调用,状态发生变化的函数

)3)返回指向静态变量的指针的函数

)4)调用线程不安全函数的函数

原因

)1)每个线程对全局变量或静态变量只有读取权限,没有写入权限。 一般来说,这些线程是安全的。

)类或接口对线程来说是原子操作;

)3)多个线程之间的切换不会给该接口的执行结果带来二义性;

常见的线程不安全的函数:

rein (同一函数由不同的执行流调用,在当前进程尚未运行时再次调用另一个进程(执行流之间的嵌套执行);

可重入:如果多个执行流重复执行一个代码,结果不会改变,通常会访问各自的专用堆栈资源;

不可再输入:如果多个执行流重复执行一个代码,其结果会改变;

授权函数:如果一个执行流由于异常或内核切换而中断正在执行的函数,并将其移动到另一个执行流,则后者操作同一函数不会影响恢复前一个执行流后的执行函数的结果。

不可重入函数:当程序运行到某个函数时,硬件中断或异常可能会导致用户执行的代码暂时终止并进入内核。 此时,需要处理某个信号,在处理该信号时,再次调用刚才中断的函数。 如果需要在函数内部操作全局变量,则在信号处理完成后,如果返回到用户状态并重新启动中断函数的上下文再次运行,对同一全局变量的操作结果可能会比预期的要更改。 这样的函数称为不可重入函数。

可重入函数满足条件:

)1)不使用全局变量或静态变量

)不要使用malloc或new分隔的空间;

(3)不调用不可再输入函数

(4)不返回静态数据或者全局数据,所有数据都提供函数的调用方

)5)通过使用本地数据或创建全局数据的本地副本来保护全局数据

不可重入函数条件(符合以下条件之一) :

)1)调用了malloc/free函数。 因为malloc函数用全局链接列表管理堆。

)2)调用标准I/O库函数,许多标准I/O库实现以不可重新导入的方式使用全局数据结构。

)3)能够重新进入体内的使用的是静态的数据结构。

常见的线程安全的情况:

)1)可以显式地重新插入函数

如果传递了所有函数的参数,并且没有指针,并且所有数据引用都是局部自动堆栈变量,即未引用静态变量或全局变量,则表示函数是可重新装入的。 这意味着,可以断言无论如何调用都是可重新读取的。

)2)隐式可重入函数

某些可重入函数的参数使用指针进行引用传递。 这意味着在调用线程并小心地传递指向非共享数据的指针时,可以进行重入。

可重入函数可以同时使用多个任务,而不用担心数据错误。 相反,可重入函数重入函数会在任意时间点暂停,以便稍后执行而不会丢失任何数据。可重入函数分类:

---------可重入函数和线程安全的区别和联系

不可重入函数不能由超过一个任务所共享,除非能确保函数的互斥(或者使用信号量,或者在 代码的关键部分禁用中断)

函数可以是可重新输入的---=---线程安全的。

可重入函数要么使用本地变量,要么在使用全局变量时保护自己的数据。

(1)重入函数是线程安全函数的一种,其特点是从多个线程调用时不引用共享数据。

)线程安全发生在多个线程上,但入口函数可以在只有一个线程的情况下使用。

)3)线程安全不一定是可重入的,可重入函数必须是线程安全的。

)4)如果某个函数有全局变量,则该函数既不是线程安全的,也不是可重入的。

)5)如果对关键资源的访问加锁的话,这个函数是线程安全的,但是这个重入函数如果没有解除加锁的话会产生死锁,所以不能重入。

)线程安全函数允许不同的线程访问同一地址空间,但入口函数必须确保不同的执行流具有相同的结果,而不影响数据操作。

ref:https://blog.csdn.net/double _ happiness/article/details/72877112

3359 blog.csdn.net/u 010027547/article/details/48158803

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。