Language agnostic C语言中的重入函数和递归函数有什么区别?

Language agnostic C语言中的重入函数和递归函数有什么区别?,language-agnostic,reentrancy,Language Agnostic,Reentrancy,在C语言中,我知道递归函数,但我听说了重入函数。那是什么?他们之间有什么区别 如果一个函数支持多个执行线程同时“通过”它,那么它就是可重入的。这可能是由于实际的多线程,我使用下面的例子,或者是由于其他海报所指出的其他原因。多线程是第一个想到的,也许也是最容易理解的,所以我将重点放在这个案例上 这意味着函数不能使用静态“全局”数据,因为该数据随后将由两个(或更多)线程并行访问,通常会严重中断。可重入函数通常有一个显式参数来保存任何特定于调用的状态,而不是静态存储 strtok()是C标准库中的一个

在C语言中,我知道递归函数,但我听说了重入函数。那是什么?他们之间有什么区别

如果一个函数支持多个执行线程同时“通过”它,那么它就是可重入的。这可能是由于实际的多线程,我使用下面的例子,或者是由于其他海报所指出的其他原因。多线程是第一个想到的,也许也是最容易理解的,所以我将重点放在这个案例上

这意味着函数不能使用静态“全局”数据,因为该数据随后将由两个(或更多)线程并行访问,通常会严重中断。可重入函数通常有一个显式参数来保存任何特定于调用的状态,而不是静态存储

strtok()
是C标准库中的一个函数的典型例子,众所周知,该函数不可重入

[编辑]:评论中有许多见解、澄清和更正,请阅读!感谢您的帮助,各位。

unwind最初所说的基本上是正确的-除了它不限于多线程(另外,使用锁保护全局数据使其具有线程安全性-但不一定是可重入的)。[编辑]他现在已经确定了他的职位来解释这一点:-)

函数也可以作为递归的结果直接或间接地重新进入同一线程(即,函数A调用函数b调用函数c调用函数A)


当然,如果您已经在多个线程可能调用它的基础上防止了重入,那么递归情况也包括在内。然而,反过来说,情况并非如此。

当你理解这个词的含义时,你会更容易记住它

术语“重新进入者”指的是,通常在并发环境中,当函数已经执行时,“重新进入”该函数是安全的

换句话说,当两个任务可以同时执行该函数而不相互干扰时,则该函数是可重入的。 当一个任务的执行对另一个任务的影响产生影响时,函数不可重入。使用全局状态或数据时通常会出现这种情况。仅使用局部变量和参数的函数通常是可重入函数。

在上一次调用返回之前调用函数时,会发生函数的“重入”。出现这种情况有三个主要原因:递归(函数本身调用)、多线程和中断。递归通常更容易,因为很明显函数将被重新输入。多线程和中断更加棘手,因为重新进入将是异步的。如其他答案所述,在大多数情况下,函数不应修改全局数据(读取全局数据是可以的,如果作为关键部分进行保护,则某些书写是可以的)。

如下:

  • 可重入函数可以由多个线程同时调用,前提是函数的每次调用都引用唯一的数据

  • 当每次调用引用共享数据时,多个线程可以同时调用线程安全函数。对共享数据的所有访问都是序列化的

不知羞耻地从Qt手册中偷来。但这是一个简短的定义。基本上,不可重入函数也不是递归安全的

现在,什么是递归函数?这是函数的一种定义。递归函数是根据自身定义的。他们减少输入,调用他们自己,直到一个基本的案例可以被解决,而无需再次调用他们自己

所以我们有两件事

  • 递归函数是一种定义
  • 可重入函数是保证每次访问唯一数据时多个线程都可以调用它们的函数

现在,上面的多线程工具仅用于同时激活多个函数。但是如果你有一个递归函数,你也可以同时激活多个函数。因此,大多数递归函数也必须是可重入的。

所有可重入代码都是递归,但并非所有递归都是可重入的。递归的例子是,任何直接或间接调用自身的函数。Reentant的示例是中断处理程序例程。

所有递归代码都是Reentant…但并非所有Reentant代码都是recursive。

Reentant函数是一个保证在多线程环境下正常工作的函数。 当函数被一个线程访问时,另一个线程可以调用它。。。意味着有单独的执行堆栈和处理每个。。。 因此,函数不应包含任何可能损害或干扰执行的静态或共享变量

在从另一个线程安全运行时,线程可以调用的平均函数。。。。。。正确地说。。。。希望我回答了正确的问题

当然,重入函数和递归函数不同。。。。完全不同的概念。。。。 可重入函数是一种保证在多线程环境下正常工作的函数。 当函数被一个线程访问时,另一个线程可以调用它。。。意味着有单独的执行堆栈和处理每个。。。 因此,函数不应包含任何可能损害或干扰执行的静态或共享变量

意味着它不应该包含任何静态或共享变量

在从另一个线程安全运行时,线程可以调用的平均函数。。。。。。正确地说。。。。希望我回答了正确的问题

当然,重入函数和递归函数不同。。。。完全不同的想法