问题标签 [race-condition]

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 投票
18 回答
759236 浏览

multithreading - 什么是竞态条件?

在编写多线程应用程序时,最常见的问题之一是竞态条件。

我对社区的问题是:

  • 什么是比赛条件?
  • 你如何检测它们?
  • 你如何处理它们?
  • 最后,如何防止它们发生?
0 投票
1 回答
295 浏览

.net - .NET 的竞争条件分析器

我已经看到有一些针对 C++、C 和 Java 的竞争条件分析工具。任何人都知道任何对.NET 执行相同操作的静态分析工具吗?

0 投票
6 回答
3330 浏览

error-handling - awk 可以跳过不存在的文件吗?

有没有办法让awk (gawk) 忽略或跳过丢失的文件?也就是说,通过命令行传递的文件不再存在于文件系统中(例如,/proc/[1-9]* 下快速出现/消失的文件)。

默认情况下,丢失文件是致命错误:-(

我希望能够做类似这样的事情:

包装脚本无法在 awk 运行之前检查文件是否存在,因为它们可能会在检查它们和 awk 尝试打开它们之间消失,即,这是一个竞争条件。(在 awk 中 check-and-then-open 也是一种竞争条件,虽然时间比较紧)

0 投票
8 回答
14066 浏览

mysql - mysql插入竞争条件

如何在 MySQL 中停止竞争条件?手头的问题是由一个简单的算法引起的:

  1. 从表中选择一行
  2. 如果不存在,则插入

然后要么你得到一个重复的行,要么你通过唯一/主键阻止它,一个错误。

现在通常我认为事务在这里有帮助,但由于该行不存在,事务实际上并没有帮助(或者我错过了什么?)。

LOCK TABLE 听起来有点矫枉过正,尤其是在表每秒更新多次的情况下。

我能想到的唯一其他解决方案是 GET_LOCK() 用于每个不同的 id,但没有更好的方法吗?这里也没有可扩展性问题吗?而且,对每个表都这样做听起来有点不自然,因为对我来说这听起来像是高并发数据库中非常常见的问题。

0 投票
7 回答
8906 浏览

database - Django中的原子操作?

我正在尝试为计数器实现(我认为是)一个非常简单的数据模型:

当有人通过时,它会查找与 visitType 和 visitDate 匹配的行;如果该行不存在,它将使用 counter=0 创建。

然后我们增加计数器并保存。

我担心的是,这个过程完全是一场竞赛。两个请求可以同时检查实体是否存在,并且它们都可以创建它。在读取计数器和保存结果之间,可能会出现另一个请求并增加它(导致计数丢失)。

到目前为止,我还没有真正找到解决这个问题的好方法,无论是在 Django 文档中还是在教程中(事实上,看起来教程的投票部分有一个竞争条件)。

我如何安全地做到这一点?

0 投票
1 回答
495 浏览

apache-flex - mx:在 Flex 中移动竞争条件

在 Flex 我有很多Move效果和AnimateProperty效果。

我在代码的几个不同位置发现,效果过于频繁地在没有明显原因的情况下中途停止。

我在我的应用程序的许多地方都发现了这一点,无论我是否在做一些特别复杂的事情,它都会发生。

有没有其他人遇到过这个问题?

0 投票
7 回答
36742 浏览

javascript - 避免 Javascript 竞争条件

我的用户看到的基本上是一个精简版的电子表格。网格中的每一行都有文本框。当他们更改文本框中的值时,我正在对他们的输入执行验证,更新驱动网格的集合,并重新绘制页面上的小计。这一切都由OnChange每个文本框的事件处理。

当他们单击Save按钮时,我正在使用按钮的OnClick事件对金额执行一些最终验证,然后将他们的整个输入发送到 Web 服务,并保存它。

至少,如果他们通过表单切换到Submit按钮,就会发生这种情况。

问题是,如果他们输入一个值,然后立即单击保存按钮,在完成SaveForm()之前开始执行UserInputChanged()——竞争条件。我的代码不使用setTimeout,但我用它来模拟缓慢的UserInputChanged验证代码:

我认为我无法加快验证代码的速度——它非常轻量级,但显然速度很慢,以至于代码会在验证完成之前尝试调用 Web 服务。

在我的机器上,~95ms 是在保存代码开始之前验证代码是否执行之间的幻数。这可能更高或更低,具体取决于用户的计算机速度。

有谁知道如何处理这种情况?一位同事建议在验证代码运行时使用信号量,并在保存代码中使用繁忙循环等待信号量解锁 - 但我想避免在我的代码中使用任何类型的繁忙循环。

0 投票
4 回答
1400 浏览

queue - 是否可以仅使用 POSIX 信号量来避免唤醒等待竞赛?是良性的吗?

我想使用 POSIX 信号量来管理从代表队列的文件中获取和放置的原子。我想要在文件系统中命名某些东西的灵活性,以便完全不相关的进程可以共享一个队列。我认为这个计划排除了 pthreads。命名的 posix 信号量非常适合在文件系统中放置任何进程都可以看到的东西,但我找不到标准的 CondWait 原语:

当进程调用 CondWait 时,它会自动发布到 sem 并等待 cond。当其他一些进程发布到 cond 时,等待进程只有在它也可以自动递减 sem 时才会唤醒。的替代品

受到竞争条件的影响,其中一些其他进程在该进程等待它之前发出 cond 信号。

我几乎没有做过任何并发编程,所以我想我会问这样:如果我对条件变量使用标准的 POSIX 计数信号量,这场比赛有可能是良性的吗?

以防万一有人想要更大的上下文,我正在为可以从 shell 脚本调用的原子队列构建 get 和 put 操作。

0 投票
4 回答
17843 浏览

java - 在解组期间从 ElementNSImpl 到自己的类型的间歇性 ClassCastException

我们遇到了一个非常难以追踪的问题,我们有时会在尝试遍历未编组的对象列表时看到 ClassCastExceptions。重要的是有时,重新启动后特定代码可以正常工作。这似乎指向并发/计时/竞争条件的方向。我可以确认 JAXBContext 以及编组器和解组器都没有同时使用。我们已经通过锁定序列化对它们的访问。

但是,由于我们在 OSGi 平台上运行,其中各个包通过 Spring DM 异步初始化,因此可能有 2 个不同的包同时创建它们的 JAXBContext。

在任何情况下,我都会感谢任何指向解释可能导致这些间歇性ClassCastExceptions 的原因。间歇性很重要,因为它们表明代码本身正常工作,但某些外部因素似乎会影响行为。

这是异常的一个具体示例(注意我删除了公司特定的东西):

第 180 行的方法是一个 for() 构造,循环遍历未编组对象内部的 TunnelType 对象集合(顺便说一句,解组工作正常)。

鉴于实际的对象解组很顺利,JAXB 是否甚至可以在物理上将 ElementNSImpl 对象留在嵌套集合中?

运行环境:

  • JAXB 2.1
  • 操作系统
  • 弹簧DM
  • JAXBContext 使用包含要编组/解组的类的包的 ClassLoader 进行初始化
0 投票
3 回答
549 浏览

python - 确保联系表格电子邮件不会丢失(python)

我有一个带有联系表格的网站。用户提交姓名、电子邮件和消息,网站通过电子邮件将详细信息发送给我。

偶尔我的服务器的电子邮件系统出现问题,因此用户收到错误并且这些联系方式丢失。(不要说:获得更好的服务器,任何服务器都会时不时地出现电子邮件关闭,我们确实会收到很多提交)。

如果邮件发送函数返回错误代码,我想实现一个可以存储用户详细信息的系统。然后在每次进一步提交时,检查任何存储的提交并尝试将它们发送给我。

但是如何存储数据?

我正在使用python,所以我考虑使用搁置(单文件半数据库)。或者也许有人可以建议更好的数据格式?(我确实认为一个完整的数据库解决方案会有点矫枉过正。)

我看到的单个文件方法的问题是竞争条件:同时发送两封或多封失败的电子邮件会导致对数据文件进行两次编辑,从而导致数据损坏。

那么该怎么办?多文件解决方案,文件锁定还是其他?