问题标签 [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.
java - 将 synchronized() 与 ReentrantLock.lock() 混合
在 Java 中,执行ReentrantLock.lock()
并ReetrantLock.unlock()
使用与 ? 相同的锁定机制synchronized()
?
我的猜测是“不”,但我希望是错的。
例子:
想象一下线程 1 和线程 2 都可以访问:
线程 1 运行:
线程 2 运行:
假设线程 1 先到达它的部分,然后在线程 1 完成之前线程 2:线程 2 是等待线程 1 离开synchronized()
块,还是继续运行?
gcc - gcc 和可重入代码
GCC 是否为所有场景生成可重入代码?
recursion - 重入和递归
说每个递归函数都需要是可重入的,这是否正确?
php - MySQL 和 PHP:执行两个后续查询的 PHP 代码块的原子性和可重入性 - 有多危险?
在 MySQL 中,我必须检查 select 查询是否返回了任何记录,如果没有,我插入一条记录。我担心 PHP 脚本中的整个 if-else 操作并不像我希望的那样原子,即在某些情况下会中断,例如,如果在需要处理相同记录的情况下调用脚本的另一个实例:
我在这里没有使用事务,并且自动提交是打开的。我正在使用 MySQL 5.1 和 PHP 5.3。该表是 InnoDB。我想知道上面的代码是否次优并且确实会中断。我的意思是相同的脚本被两个实例重新输入,并且发生以下查询序列:
- 实例1尝试选择记录,没有找到,进入block进行insert查询
- 实例2尝试选择记录,没有找到,进入block进行insert查询
- 实例 1 尝试插入记录,成功
- 实例 2 尝试插入记录,失败,自动中止脚本
这意味着实例 2 将中止并返回错误,跳过插入查询语句之后的任何内容。我可以使错误不是致命的,但我不喜欢忽略错误,我更愿意知道我的恐惧是否在这里真实存在。
更新:我最终做了什么(这样可以吗?)
有问题的表有助于限制(实际上是允许/拒绝)应用程序发送给每个收件人的消息数量。系统不应在 Z 期间内向收件人 Y 发送超过 X 条消息。该表 [概念上] 如下:
还有 [有点简化/概念性的] PHP 代码块,它应该执行原子事务,维护表中的正确数据,并根据油门状态允许/拒绝发送消息:
好吧,不管发生 InnoDB 死锁的事实,这很好,不是吗?我没有捶胸顿足之类的,但这只是我能做到的性能/稳定性的最佳组合,没有使用 MyISAM 并锁定整个表,我不想这样做,因为更频繁的更新/插入 vs选择。
c# - C#中的线程和静态方法
下面以一个无意义的扩展方法为例:
假设一个执行线程完成并包括以下行:
处理器然后上下文切换,另一个线程进入相同的方法并完成该行:
我是否正确假设第一个线程创建和分配的变量“x”与第二个线程创建和分配的变量“x”位于单独的堆栈上,这意味着该方法是可重入的?
c - C中的可重入库设计
假设我正在构建一个库来在 C 中使用 quuxes。
Quuxes 需要两个状态变量才能成功触发:
如果我将该数据存储为全局变量,那么一次只有一个客户端能够触发 quux,否则状态变量将被第二个调用者破坏,并且可能会发生灾难。
问题是用 C 设计可重入库的最佳方法是什么?
我曾受理过以下案件,但没有令人满意的结论。
在以下情况下,问题是如何将客户端与每个状态相关联?
在以下情况下,客户端能够弄乱状态,非常不可取
那么,如何正确地做到这一点呢?
perl - 将变量推入数组是线程安全的操作吗?
我有以下 Perl 代码:
操作是原子的,还是我需要使用锁,如果多个线程将在多个线程上执行相同的操作?
c# - 带管理等待的 Gui 重入
我在使用 NotifyIcons 时发现了一个重入问题。这真的很容易重现,只需在表单上放置一个 NotiftIcon,点击事件应该如下所示:
还要启动一个后台线程,这将导致一些争用:
现在,如果您开始单击通知图标,则会弹出消息,指示可重入。我知道 STA 中的托管等待应该为某些窗口发送消息的原因。但我不确定为什么通知图标的消息会被抽出。还有一种方法可以在进入/退出方法时不使用一些布尔指标来避免抽水吗?
c - 为什么说 malloc() 和 printf() 是不可重入的?
在 UNIX 系统中我们知道malloc()
是一个不可重入函数(系统调用)。这是为什么?
同样,printf()
也可以说是不可重入的;为什么?
我知道重入的定义,但我想知道为什么它适用于这些功能。是什么阻止了他们保证可重入?