Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Function “可重入函数”的定义_Function_Concurrency_Interrupt_Conceptual_Reentrancy - Fatal编程技术网

Function “可重入函数”的定义

Function “可重入函数”的定义,function,concurrency,interrupt,conceptual,reentrancy,Function,Concurrency,Interrupt,Conceptual,Reentrancy,我看到过几篇帖子要求解释什么是可重入性,或者回答说什么是可重入性,但没有一篇帖子要求给出精确的定义,因此: 可重入函数概念的精确定义是什么?根据我目前的理解,我将提出以下定义 函数F是可重入的当且仅当函数F满足以下条件时: 对于F的任意两个调用A和B,如果 条件1调用B在调用A开始之后但在调用完成之前开始 及 条件2呼叫A仅在呼叫B完成后恢复 及 条件3如果隔离,调用A和B都会成功* 然后,在没有干扰外部事件的情况下,例如断电、不相关线程中的seg故障等 保证1呼叫A保证成功* 及 保证2呼叫B

我看到过几篇帖子要求解释什么是可重入性,或者回答说什么是可重入性,但没有一篇帖子要求给出精确的定义,因此:


可重入函数概念的精确定义是什么?

根据我目前的理解,我将提出以下定义

函数F是可重入的当且仅当函数F满足以下条件时:

对于F的任意两个调用A和B,如果

条件1调用B在调用A开始之后但在调用完成之前开始 及

条件2呼叫A仅在呼叫B完成后恢复 及

条件3如果隔离,调用A和B都会成功* 然后,在没有干扰外部事件的情况下,例如断电、不相关线程中的seg故障等

保证1呼叫A保证成功* 及

保证2呼叫B保证成功* *读取成功=完成并产生正确的结果和副作用


注意,这对于线程安全来说是不够的,因为它不能保证在调用B完成之前继续调用A时会发生什么情况。

如果函数可以通过相同的行为和结果同时被不同的线程调用,则函数是可重入的,就像它只被一个线程调用一样。

没有单一的可重入定义;这取决于上下文。特别是,C++标准根本没有提到它。它通常意味着当一个函数被多个线程同时调用时,无论是否需要一些锁定,它都具有定义良好的行为,但它也可能意味着,例如,一个函数可以被同一个线程递归地再次调用。可重入性的概念可能适用于函数以外的其他事物,例如,在C标准中,您可以找到以下文本:

锁是可重入的:单个线程可以在给定时间多次持有锁


不正确:可以在中断处理程序中中断并再次调用的函数不需要满足线程安全要求,并且仍然是可重入的。我不太确定它是否取决于上下文。我更倾向于简单地认为人们使用它有不同的含义,因为他们不理解它。当应用于函数以外的其他事物时,其含义是从锁示例中的可重入函数的含义中派生出来的。如果锁定机制本身是可重入的,那么可以等价地说锁是可重入的。那么这个函数是可重入的吗?无符号f{静态无符号x=0;x+=rand;返回x;}?如果我用原子x替换无符号x,它是可重入的吗?我认为你不会在任何一组开发人员中找到关于这个问题的一致意见。第1个版本是不可重入的,因为再次调用f的中断可能会导致未定义的行为;如果你有x原子,我会说不清楚f是否是可重入的,只是在同样的意义上,不清楚f的正确性是什么。如果你说f是正确的,如果f的n次求值产生的随机数小于n+1次求值,并且考虑到求值的索引是按照求值完成的顺序进行的,那么我认为大多数人都会同意,假设原子操作不能被中断,那么原子的版本是可重入的。