我一直在寻找可重入函数的定义和使用。但是我无法理解其他网页中给出的定义。如果有人知道请简单解释一下吗?
答案 0 :(得分:7)
维基百科在re-entrancy上有很好的文章。
如果函数可以在其中间被中断,则称为
UIImagePickerControllerSourceTypePhotoLibrary
执行然后再安全地再次呼叫(“重新进入”) 以前的调用完成执行
是什么让一个功能无法重入? 进一步检查文章,但粗略地说:
不要在函数中使用静态或全局变量,因为这些变量可能会在函数恢复时更改
函数不能修改自己的代码(例如,某些低级图形例程可能有“习惯”来生成自己的代码)
不要调用任何不符合上述两条规则的功能
何时使用重入功能?以下是一些例子:
在中断上下文中执行的函数必须是可重入的。
将从多个线程/任务调用的函数必须是可重入的。
答案 1 :(得分:2)
重入函数是一种可以在线程或可中断环境中安全调用的函数。它通常意味着它不依赖变量或正确使用互斥锁来防止同时访问同一个数据对象。
所以问题是这个。如果你调用一个函数,它会设置一些变量。然后在第一次调用从另一个线程(或中断)完成之前调用相同的函数,新调用将破坏您已设置的变量。 当中断线程完成后,您的原始功能将恢复,但现在具有不同的数据。因此失败了。
简而言之,可重入函数可以防止此类问题
答案 2 :(得分:2)
可重入函数是可以被中断的函数(通常在线程上下文切换期间),并且由另一个线程重新输入而没有任何不良影响。
依赖于局部变量的函数被认为是可重入的,因为它们的变量被安全地封装在线程之间。
考虑使用全局变量的非重入函数的情况。
线程A在函数X中,并递增一个全局变量。线程B中断线程A,进入函数X并增加相同的全局变量。
线程A的行为和状态已经被另一个线程更改(很可能是错误的),因此它所在的函数不能被认为是可重入的。
答案 3 :(得分:2)
可重入适用于并发编程。即使从并发多个线程调用(重新进入)函数,重入函数也可以保证它的功能。另请查看what is reentrant function?
答案 4 :(得分:1)
放在最简单的(或者简单到 I cn make it,一个可重入的函数是一个可以在它实际完成执行之前重新输入的函数。
一种典型的情况是中断,当中断发生时你可能处于函数中间,然后中断服务程序将该函数作为其工作负载的一部分调用。
另一个是递归,其中函数调用自身(直接或间接)。
可重入函数必须遵循某些指导原则(例如在C中不使用静态变量),以免它们的不同实例相互踩踏。