问题标签 [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 回答
5671 浏览

java - 将 synchronized() 与 ReentrantLock.lock() 混合

在 Java 中,执行ReentrantLock.lock()ReetrantLock.unlock()使用与 ? 相同的锁定机制synchronized()

我的猜测是“不”,但我希望是错的。

例子:

想象一下线程 1 和线程 2 都可以访问:

线程 1 运行:

线程 2 运行:

假设线程 1 先到达它的部分,然后在线程 1 完成之前线程 2:线程 2 是等待线程 1 离开synchronized()块,还是继续运行?

0 投票
6 回答
4050 浏览

gcc - gcc 和可重入代码

GCC 是否为所有场景生成可重入代码?

0 投票
4 回答
2065 浏览

recursion - 重入和递归

说每个递归函数都需要是可重入的,这是否正确?

0 投票
2 回答
717 浏览

php - MySQL 和 PHP:执行两个后续查询的 PHP 代码块的原子性和可重入性 - 有多危险?

在 MySQL 中,我必须检查 select 查询是否返回了任何记录,如果没有,我插入一条记录。我担心 PHP 脚本中的整个 if-else 操作并不像我希望的那样原子,即在某些情况下会中断,例如,如果在需要处理相同记录的情况下调用脚本的另一个实例:

我在这里没有使用事务,并且自动提交是打开的。我正在使用 MySQL 5.1 和 PHP 5.3。该表是 InnoDB。我想知道上面的代码是否次优并且确实会中断。我的意思是相同的脚本被两个实例重新输入,并且发生以下查询序列:

  1. 实例1尝试选择记录,没有找到,进入block进行insert查询
  2. 实例2尝试选择记录,没有找到,进入block进行insert查询
  3. 实例 1 尝试插入记录,成功
  4. 实例 2 尝试插入记录,失败,自动中止脚本

这意味着实例 2 将中止并返回错误,跳过插入查询语句之后的任何内容。我可以使错误不是致命的,但我不喜欢忽略错误,我更愿意知道我的恐惧是否在这里真实存在。

更新:我最终做了什么(这样可以吗?)

有问题的表有助于限制(实际上是允许/拒绝)应用程序发送给每个收件人的消息数量。系统不应在 Z 期间内向收件人 Y 发送超过 X 条消息。该表 [概念上] 如下:

还有 [有点简化/概念性的] PHP 代码块,它应该执行原子事务,维护表中的正确数据,并根据油门状态允许/拒绝发送消息:

好吧,不管发生 InnoDB 死锁的事实,这很好,不是吗?我没有捶胸顿足之类的,但这只是我能做到的性能/稳定性的最佳组合,没有使用 MyISAM 并锁定整个表,我不想这样做,因为更频繁的更新/插入 vs选择。

0 投票
3 回答
2487 浏览

c# - C#中的线程和静态方法

下面以一个无意义的扩展方法为例:

假设一个执行线程完成并包括以下行:

处理器然后上下文切换,另一个线程进入相同的方法并完成该行:

我是否正确假设第一个线程创建和分配的变量“x”与第二个线程创建和分配的变量“x”位于单独的堆栈上,这意味着该方法是可重入的?

0 投票
3 回答
1521 浏览

c - C中的可重入库设计

假设我正在构建一个库来在 C 中使用 quuxes。

Quuxes 需要两个状态变量才能成功触发:

如果我将该数据存储为全局变量,那么一次只有一个客户端能够触发 quux,否则状态变量将被第二个调用者破坏,并且可能会发生灾难。

问题是用 C 设计可重入库的最佳方法是什么?

我曾受理过以下案件,但没有令人满意的结论。

在以下情况下,问题是如何将客户端与每个状态相关联?

在以下情况下,客户端能够弄乱状态,非常不可取

那么,如何正确地做到这一点呢?

0 投票
4 回答
6953 浏览

c++ - C、C++ 中可重入代码的推荐实践

在编写可重入代码时,我正在阅读有关推荐实践的重入指南。

还有哪些其他参考资料和资源涵盖了该主题?

可以使用哪些类似 lint 的工具来检查这些问题?

0 投票
1 回答
434 浏览

perl - 将变量推入数组是线程安全的操作吗?

我有以下 Perl 代码:

操作是原子的,还是我需要使用锁,如果多个线程将在多个线程上执行相同的操作?

0 投票
2 回答
1855 浏览

c# - 带管理等待的 Gui 重入

我在使用 NotifyIcons 时发现了一个重入问题。这真的很容易重现,只需在表单上放置一个 NotiftIcon,点击事件应该如下所示:

还要启动一个后台线程,这将导致一些争用:

现在,如果您开始单击通知图标,则会弹出消息,指示可重入。我知道 STA 中的托管等待应该为某些窗口发送消息的原因。但我不确定为什么通知图标的消息会被抽出。还有一种方法可以在进入/退出方法时不使用一些布尔指标来避免抽水吗?

0 投票
6 回答
22855 浏览

c - 为什么说 malloc() 和 printf() 是不可重入的?

在 UNIX 系统中我们知道malloc()是一个不可重入函数(系统调用)。这是为什么?

同样,printf()也可以说是不可重入的;为什么?

我知道重入的定义,但我想知道为什么它适用于这些功能。是什么阻止了他们保证可重入?