问题标签 [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 投票
3 回答
891 浏览

c++ - C++ 的新操作符是可重入的(或异步安全的)吗?

背景是我的这个问题。简而言之,我必须 fork在一个多线程 C++ 程序中,所以我想弄清楚当仅限于可重入函数时我能做多少,其中最重要的事情之一是动态内存。

因此,已知malloc不可重入的。但是 C++ 的new呢?我用谷歌搜索了相关结果并不多(主要是由于难以找到正确的“新”),但至少有一个声明new reentrant。还有一个关于整个 C++ 标准库的相关问题没有令人满意的答案。

编辑:我想标准没有说明这一点,所以我最关心的是主要实现。

0 投票
1 回答
216 浏览

asp.net - ASP.NET 站点以递归方式 HTTP 请求其自己的 URL

背景:我有一个 ASP.NET MVC Web 应用程序。我想定期捕获其用户可见的 HTML 内容并将其保存在某个地方,以便我可以跟踪内容如何随着时间的推移而演变。例如,我希望能够提取一年前存在的主页 HTML。这可以使用某种爬虫来完成,该爬虫会定期遍历 URL 列表。

我的问题:让网站本身发布HttpWebRequest到自己的 URL是否是个好主意?我可以Timer在 Web 应用程序内部启动一个每小时下载和存储一个 URL 的应用程序。

另一种架构是将爬虫放在外部应用程序(如 Windows 服务)中。不过,这将是一个复杂得多的架构。在这个问题中,我不想探索这个选项,因为我试图摆脱一个更简单的架构。

如果 ASP.NET 应用程序使用 请求自己的 URL,会出现什么问题HttpWebRequest

在伪代码中:

我不确定会发生什么坏事。我正在考虑处理重入问题。我必须小心分布式死锁等。

0 投票
2 回答
1137 浏览

java - 从多个 Java 线程调用不可重入的本机共享库

我有一些 Java 代码正在调用一些本机代码,这些代码最初是用 Fortran 编写的,使用 JNA。(它是一个数值库,许多数学家在 Fortran 中进行编码。)它被编译成一个.so库,见下文:

在我的代码中对所有单元进行了测试,我得到了很好的结果,但后来我尝试使用来自多个线程的代码,一切都开始失败并出现奇怪的错误。然后我研究了一些关于可重入 Fortran 代码的东西,并意识到我使用的库相当于一些全局变量(SAVEFortran 中的关键字,它在再次调用函数时记住变量的值:fortran SAVE 语句

现在,我正在将对库的调用打包成synchronized块,但这会显着降低性能。在我看来,将库重新设计为可重入需要付出巨大的努力(它有几千行数字代码,并且不清楚在运行子例程时这些值如何传递。)有谁知道解决问题的最佳方法是什么?我的想象表明...

  • 有没有办法让每个 Java 线程在内存中加载共享库的单独副本,以便全局变量有效地是线程本地的?这甚至可能吗?我不确定 JNA 的直接绑定或库绑定是如何工作的,以及是否有办法以这种方式使用它。
  • 即使从不同的虚拟机调用它还会被搞砸吗?我如何检查以确保?
  • 有没有办法让gfortran( gcc) 以可重入的方式编译 Fortran 代码?
  • 是否有一些快速而肮脏的方法可以使 Fortran 代码可重入?我搜索了RECURSIVE关键字,它显然将变量保留在堆栈中,但这似乎与现有代码不兼容。
  • 还有其他可能的解决方案吗?

我确认多个虚拟机一切正常;这是有道理的,因为它们不共享内存。仍然是 PITA,而且比线程更不方便。

0 投票
2 回答
252 浏览

ios - 使用 GCD 和代码重用:避免可重入代码死锁

我正在使用 GCD 为类添加线程安全性。

我的类的一些公共方法被类中的其他公共方法调用。但是,这会导致重入锁定问题:如果我使用同步 GCD 块(在某些情况下)保护适当的公开可见方法,则重用意味着有时我会尝试在当前队列上运行另一个同步块,从而导致死锁。

什么是最优雅的解决方案?一个明显的方法是拥有适当方法的内部版本,没有任何 GCD 块,以及具有 GCD 块包装对内部方法的调用的方法的外部公共版本。这对我来说不太合适。

0 投票
1 回答
2453 浏览

c - 出于实际目的,SSL_library_init 是什么意思不可重入?

我正在使用 openssl 库打开与某个服务器的 TLS 连接。阅读库文档(是的,有些人仍然阅读文档和手册页)我偶然发现了“SSL_libary_init() 不是可重入的”这句话。

我一般理解什么是不可重入函数:即某些函数以这样的方式保持内部状态,即同时调用它两次或在执行时中断它可能会导致混乱(该函数没有按照调用者的期望执行) .

但在 SSL_library_init() 的特定情况下,我想知道它的实际含义。

  • 这是否意味着如果在调用 SSL_library_init() 时发生某些中断,它将无法正确初始化 SSL 库?因此,我是否应该在调用它之前禁用所有可访问的中断并重新启用所需的中断?

  • 这是否意味着它是线程不安全的,并且我应该确保两个线程不能同时调用它?(看起来很可能,即使线程安全并不完全意味着与可重入相同)。

  • 这是否意味着我不应该在程序生命周期内调用它两次,或者在 SSL 连接打开时调用它会造成严重破坏?

由于我正在使用一端作为客户端,另一端作为服务器的代理,因此两端都可能使用 TLS 服务(但我也可能只是一端,或者没有)。我应该将 SSL 库作为系统范围的单例来管理吗?如果是这种情况,那么管理起来很容易,但正如我所理解的那样,这并不完全是一个可重入问题。

我不知道应该只调用一次的函数的简称...

对于 SSL_CTX_new(),我也有类似的问题。文档指出每个程序生命周期只能调用一次。这很烦人,因为它似乎限制服务器和客户端(或在同一进程中运行的多个独立服务器或客户端实例)使用相同的 SSL_METHOD 并且感觉不对,但我仍然希望在这种情况下它只是一些文档不准确.

有没有人有足够的 openSSL 经验来解释我应该或不应该对 OpenSSL 初始化代码做什么以保持安全?

0 投票
6 回答
16712 浏览

java - Java中的“ReentrantLock”是什么意思?

重入意味着锁是在每个线程而不是每个调用的基础上获取的。

既然内在锁是由一个线程持有的,那不是说一个线程运行一次就等于一个调用基础吗?

谢谢,这似乎意味着:在一个线程中,如果我lockA在处理doA调用函数的函数时得到一个锁doB,并且doB还需要一个锁lockA,那么就会有重入。在Java中,这种现象是每个线程获得的,所以我不需要考虑死锁?

0 投票
1 回答
694 浏览

reentrancy - 什么是真正的重入函数?

我已经阅读了关于 SO 以及http://en.wikipedia.org/wiki/Reentrancy_(computing)的重入主题的可能主题。

我可能会得到可重入函数的想法。但是当我阅读 wiki 网站上的示例时,我真的很困惑。

第一个例子:

正如该站点解释的那样:“它仍然无法重入,如果 isr() 在与已经执行 swap() 的线程相同的上下文中被调用,这将继续导致问题。 ” => 这里可能会发生什么样的问题? 交换结果不正确?还是修改了 t 变量的值?

第二个例子,它改进了第一个例子:

这如何改进第一个?这是否意味着变量 t 在 swap() 函数中保持不变?

0 投票
1 回答
1366 浏览

vba - 必须在 MS Access 2010 中调用 SetFocus 两次

我发现这段代码工作了几个小时:

然后它神秘地停止了工作。我认为这可能与处理 OnEnter 子例程有关(我将光标移动到文本字段的末尾)。

然而,编辑 OnEnter 子例程并没有帮助。我唯一做的另一件事是改变我的输入/键盘语言(能够输入引号并让它们立即出现,huzzah!)

我现在有这个代码:

哪个有效。因此,我知道 SetFocus 的 50 多页搜索结果不起作用,这与它被隐藏、禁用、不可见、与牧师喝茶等有关,这里适用。

我也尝试过首先将焦点设置到另一个控件,并且也自由地应用了 DoEvents,但都没有帮助。

有没有人遇到过类似的事情,或者这只是一个非常奇怪的 Heisenbug?

0 投票
1 回答
710 浏览

c - 信号处理程序内的格式化 I/O

我想编写一个 SIGSEGV 处理程序,将消息写入文件(FILE *)。我听说 fprintf 不是可重入的,不应该在信号处理程序中调用。是否有它的可重入版本,或提供可在信号处理程序内调用的格式化文件 I/O 的任何其他函数?

0 投票
1 回答
417 浏览

c++ - main() 函数是可重入的吗?

我听说在 C 中,main() 是可重入的,而在 C++ 中则不是。

这是真的?重新进入main()函数的场景是什么?