问题标签 [reentrancy]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
4 回答
895 浏览

linux - 如何说服我的同事 linux 内核代码是可重入的?

是的,我知道......有些人有时很难说服我们其他人听起来很自然,我现在需要你的帮助 SO社区(或者我很快就会去邮寄......)

我的一位同事确信 linux 内核代码不会重入,因为他可能在 7 年前最后一次对它感兴趣时在某个地方读到它。可能当时它的阅读是正确的,请记住,多核架构在前一段时间并没有广泛普及,并且 linux 项目在其开始时左右并没有完全写好并且完全成熟并具有所有花哨的功能。

今天不一样了。很明显,从在相同架构上并行运行的不同进程调用相同的系统调用不会导致未定义的行为。Linux 内核现在很普遍,即使在多核架构上运行,它也以其可靠性而闻名。这是我现在的论点。但是你有什么可以客观地证明这一点呢?

我想向他展示 linux 内核中的一些功能(在lxr 网站上)作为 mutex_lock() 系统调用。一切都经过调整以使其在并发环境中工作。但是对于新手(就像我一样)来说,代码可能并不那么明显。

请帮我.. ;-)

0 投票
1 回答
3202 浏览

java - 通过 ReentrantLock 访问的字段是否需要 volatile 关键字?

我的问题是关于使用 ReentrantLock 是否能保证字段的可见性与 synchronized 关键字提供的相同。

例如,在下面的类A中,字段sharedData不需要声明为 volatile,因为使用了 synchronized 关键字。

然而,对于下一个使用 ReentrantLock 的示例,字段上的 volatile 关键字是否必要?

我知道无论如何使用 volatile 关键字只会对性能造成很小的影响,但我仍然想正确编码。

0 投票
4 回答
90 浏览

multithreading - 托管语言和运行时的未来保护

将来,托管运行时是否会针对细微的数据损坏问题提供额外的保护?

Java 和 .NET CLR 等托管运行时减少或消除了 C# 等本地语言中常见的许多内存损坏错误的可能性。尽管如此,令人惊讶的是,它们并不能免受所有内存损坏问题的影响。人们直观地期望验证其输入、没有错误并稳健地处理异常的方法将始终将其对象从一种有效状态转换为另一种有效状态,但事实并非如此。(更准确地说,使用流行的编程约定并非如此——对象实现者需要竭尽全力避免我描述的问题。)

考虑以下场景:

  1. 穿线。调用者可能与其他线程共享对象并对其进行并发调用。如果对象未实现锁定,则字段可能已损坏。(也许——除非通知对象是线程安全的——如果同一对象上的任何方法在另一个线程上同时执行,运行时应该在每个方法调用上使用互锁以引发异常。这将是一种保护功能,只是与托管运行时的其他广为接受的安全功能一样,它也有一定的成本。)

  2. 重入。该方法对任意函数(例如事件处理程序)进行调用,该函数最终调用对象上的方法,而这些方法并非设计为在该点调用。这甚至比线程安全更棘手,许多类库都没有做到这一点。(更糟糕的是,众所周知,类库很少记录允许重入的内容。)

对于所有这些情况,可以说完整的文档是一种解决方案。但是,文档也可以规定如何在非托管语言中分配和取消分配内存。我们从经验中知道(例如,内存分配),文档和语言/运行时执行之间的区别是白天和黑夜。

我们对未来的语言和运行时有什么期望来保护我们免受这些问题和其他类似的微妙问题的影响?

0 投票
5 回答
30044 浏览

c# - 在其回调方法中停止计时器

我有一个 System.Threading.Timer 每10 ms调用一次相应的事件处理程序(回调)。该方法本身不是可重入的,有时可能需要超过 10 ms的时间。因此,我想在方法执行期间停止计时器。

代码:

MSDN 声明回调方法在线程池的单独线程中被调用(每次定时器触发)。这意味着,如果我在方法中的第一件事中停止计时器,它仍然不一定会阻止计时器触发并在第一个有机会停止计时器之前运行该方法的另一个实例。

是否应该锁定计时器(甚至是不可重入方法本身)?在执行其回调(和不可重入)方法期间防止计时器触发的正确方法是什么?

0 投票
3 回答
595 浏览

multithreading - 并发执行/重入/ThreadSafe/?

我在这里阅读了许多与线程安全、重入相关的问题的答案,但是当我想到它们时,我想到了更多的问题,因此这个问题。

1.) 我有一个可执行程序说一些 *.exe。如果我在命令提示符下运行这个程序,并且在它执行时,我在另一个命令提示符下运行相同的程序,那么在什么情况下结果可能会被破坏,即这个程序的代码应该是可重入的还是应该是单独线程安全?

2.) 在定义重入的时候,我们说例程可以在已经运行的时候重新进入,在什么情况下可以重新进入函数(除了是递归例程,我这里不是说递归执行) . 必须有某个线程才能再次执行相同的代码,或者如何再次输入该函数?

3.) 在实际情况下,两个线程是否会执行相同的代码,即执行相同的功能。我认为多线程的想法是同时执行不同的功能(在不同的内核/处理器上)。

抱歉,如果这些查询看起来不同,但它们都发生在我身上,同时我在 SO 上阅读了有关线程安全 Vs 可重入的帖子,因此我将它们放在一起。

任何指针,阅读材料将不胜感激。

谢谢,

-广告。

0 投票
7 回答
3463 浏览

recursion - 递归函数是否可重入

我见过许多递归函数(主要用于计算一些数学运算,例如阶乘、数字中的数字之和等),它们涉及使用一个静态变量,该变量保存每个递归调用/操作的结果,以及将其用于后续调用。

这是否使递归函数不可租用且不是线程安全的。

是否还有其他不需要静态变量的递归函数用例?

0 投票
2 回答
3465 浏览

parsing - 什么是可重入解析器?

谁可以给我解释一下这个?特别是之间的区别:

http://github.com/whymirror/greghttp://piumarta.com/software/peg/

前者是后者的可重入版本。

0 投票
1 回答
3192 浏览

c# - 如何修复 Visual Studio 调试器给出的“检测到重入”警告?

在调试模式下运行我们的单元测试时,Visual Studio 调试器会在某个点中断以显示可重入 MDA。链接的文章解释说,当低级操作系统扩展点(例如向量异常处理程序)回调托管应用程序代码时,就会发生这种情况。

显然这会导致堆损坏或其他严重问题,所以我肯定想修复它。

我正在查看显示此警告的位置的堆栈跟踪,但我无法确定此处涉及哪个“低级操作系统扩展点”。除了一次由 mstest 和调用System.Windows.Forms.Cursors.VSplitgetter 引起的转换之外,我没有看到任何非托管/托管转换。此外,仅从单元测试中调用该 getter 似乎不足以触发警告。

我在这里做错了什么,我该如何解决?

0 投票
1 回答
7860 浏览

thread-safety - 使用 Flex 编写可重入词法分析器

我是弯曲的新手。我正在尝试使用 flex 编写一个简单的可重入词法分析器/扫描器。词法分析器定义如下。我遇到编译错误,如下所示(yyg 问题):

可重入的.l:

编译错误:

0 投票
8 回答
94238 浏览

c++ - 究竟什么是可重入函数?

大多数 时候,重入 定义引用自维基百科

如果计算机程序或例程在其先前的调用完成之前可以 安全地再次调用(即可以安全地同时执行),则将其描述为可重入的。可重入,计算机程序或例程:

  1. 必须不保存静态(或全局)非常量数据。
  2. 不得将地址返回给静态(或全局)非常量数据。
  3. 必须仅对调用者提供给它的数据起作用。
  4. 不能依赖锁来锁定单例资源。
  5. 不得修改自己的代码(除非在自己独特的线程存储中执行)
  6. 不得调用不可重入的计算机程序或例程。

如何安全定义?

如果一个程序可以安全地并发执行,是否总是意味着它是可重入的?

在检查我的代码的可重入能力时,我应该牢记的六点之间的共同点到底是什么?

还,

  1. 所有递归函数都是可重入的吗?
  2. 所有线程安全函数都是可重入的吗?
  3. 所有递归和线程安全的函数都是可重入的吗?

在写这个问题的时候,我想到了一件事:像重入线程安全这样的术语是绝对的吗,即它们有固定的具体定义吗?因为,如果他们不是,这个问题就没有多大意义。