什么样的代码可以被称为“可重入”?

6 浏览
0 Comments

什么样的代码可以被称为“可重入”?

有人能告诉我什么样的代码可以被称为“可重入”代码吗?

我在阅读一些实时操作系统时遇到了这个词。为了使代码成为“可重入”代码,必须遵守哪些原则?

0
0 Comments

"re-entrant"是指可以在没有完成的情况下再次调用相同方法的代码。这种代码可以是任何递归代码,但在讨论锁、互斥体、信号量等时,特别会使用这个术语。例如,如果一旦获得锁,就可以成功地再次“锁定”代码(即不会发生死锁),那么该锁就是可重入的。在上面的例子中,锁是可重入的,这意味着我们可以在不担心已经拥有“独占”锁的情况下调用Contains和Add,使代码更简单。内部使用一个计数器而不是简单的“使用中”标志。

原因:

- 可重入的代码可以简化编程,因为不需要判断当前是否已经拥有锁。

- 可重入的代码可以降低死锁的风险,因为在同一个线程中可以多次获取同一个锁。

解决方法:

- 使用计数器来跟踪锁的重入次数,而不是简单的布尔标志。

- 在代码中使用适当的锁机制(如互斥体、信号量等),这些机制可以处理重入的情况。

- 让代码的设计和逻辑允许重入操作,避免在重入操作中出现问题。

可重入的代码可以在没有完成的情况下再次调用相同方法,这在处理锁、互斥体、信号量等时非常有用。它简化了编程,降低了死锁的风险。要实现可重入的代码,可以使用计数器来跟踪锁的重入次数,使用适当的锁机制,以及设计和逻辑上允许重入操作。

0
0 Comments

可以被称为"可重入"的代码是一种能够在之前的调用完成之前被另一个线程进入的代码块,而不会影响第一个线程通过代码的路径。也就是说,当代码已经在运行时,仍然可以重新进入代码并产生正确的结果。

大多数情况下,"actors"是同一个进程的线程,但是"线程安全"和"可重入"的概念是有细微区别的:并不是每个线程安全的代码块都是可重入的,但是每个可重入的代码块都是线程安全的。也就是说,可重入性是比线程安全性更强的属性。以下是来自Raymond Chen的一个很好的例子,说明了一段代码如何是线程安全但不可重入。

当代码是递归的时候,有一种特殊情况:同一个线程在自己的调用完成之前调用了该代码。所有正确的递归代码都是可重入的;当然,并不是每个可重入的代码块都是递归的。

不是所有的递归代码都是可重入的。在某些8x51编译器上,局部变量存储在静态地址上。可以递归调用的例程有一个"正在使用"的标志;如果例程在"正在使用"的标志被设置时进入,它将把变量复制到堆栈并清除该标志。在例程进行可能递归的调用之前,它设置了"正在使用"的标志;一旦该调用返回,如果标志没有被设置,该例程重新从堆栈加载变量。以这种方式编码的例程支持递归,但不是可重入的。

"......但每个可重入的代码块都是线程安全的。"您是否介意查看一下关于"重新进入"的维基百科条目?因为有一个例子是一个函数是可重入但不是线程安全的。编辑人员可能犯了一个错误吗?谢谢。

和ánErasmo一样的问题。我越读越觉得可重入和线程安全可能是互斥的;也就是说,只能是其中之一。参考这篇Qt文章,它与您所说的正好相反:"因此,一个线程安全的函数总是可重入的,但一个可重入的函数并不总是线程安全的。"

0
0 Comments

可重入代码是指在早期调用完成之前,可以被另一个actor进入的代码块。也就是说,在代码正在运行时,仍然可以重新进入该代码块。

但是非可重入代码也具备这样的特性。如果代码块没有考虑到这个问题,第二个actor仍然可以同时进入该代码块。

问题在于这对两个调用的结果有什么影响。更准确地说,可重入代码是指在早期调用完成之前,可以被另一个actor进入的代码块,而不会改变任何调用的结果。任何调用都不应该能够检测到其他调用的“存在”。

直到现在我才注意到这个答案!感谢你的澄清;你说得对,我本可以更具体一些。我会相应地修改。

0