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

linux - 同步 shell 脚本执行

shell 脚本的修改版本将音频文​​件从 FLAC 转换为 MP3 格式。该计算机具有四核 CPU。该脚本使用以下命令运行:

这会将flac目录中的 FLAC 文件(文件名中没有空格)转换为目录中的 MP3 文件mp3(与 同级flac)。如果目标 MP3 文件已存在,则脚本会跳过该文件。

问题是有时脚本的两个实例几乎同时检查是否存在同一个 MP3 文件,从而导致 MP3 文件损坏。

您将如何多次运行脚本(即每个内核一次),而不必在每个命令行上指定不同的文件集,并且不覆盖工作?

更新 - 最小竞争条件

该脚本使用以下锁定机制:

但是,这仍然留下了竞争条件。

0 投票
1 回答
2139 浏览

jquery - jQuery远程验证竞争条件

我在与 jQuery 表单插件结合使用的 jQuery 验证插件和远程验证规则方面遇到问题。

所以我使用jQuery表单插件拦截表单提交,如果验证失败,则表单不提交。但是,如果远程规则已经被验证(等待来自服务器的回答),无论如何都会发送表单。

如果它在一切正常之前或之后,我对表格的其他规则也是如此。但是,如果我在远程规则的 GET 中间,则 $('#myform').validate.form() 将返回 true,并提交表单。

所以代码看起来像这样:

有没有办法强制等待挂起的远程验证?

或者也许我可以在验证规则中只留下'onsubmit:true',所以我可以确保验证只在提交时发生并等待完成,然后再返回validate().form()的值,但这是我的最后一个采取。

0 投票
7 回答
155931 浏览

wordpress - 如何从 WordPress 数据库中获取最后插入的行 ID?

我的 WordPress 插件有一个表,其中有一个名为 ID的AUTO_INCREMENT主键字段。当向表中插入新行时,我想获取插入的 ID 值。

该功能是使用 AJAX 将数据发布到服务器以插入数据库。新的行 ID 在 AJAX 响应中返回以更新客户端状态。多个客户端可能同时向服务器发布数据。因此,我必须确保每个 AJAX 请求都获得准确的新行 ID 作为响应。

在 PHP 中,有一个名为mysql_insert_id的方法用于此功能。但是,只有当参数是最后一次操作的link_identifier时,它才对竞态条件有效。我对数据库的操作是在 $wpdb 上。如何从 $wpdb 中提取link_identifier以确保 mysql_insert_id 工作?有没有其他方法可以从 $wpdb 获取最后插入的行 ID?

谢谢。

0 投票
5 回答
6472 浏览

python - 在 Python 中创建竞争条件文件夹

我有一个 urllib2 缓存模块,由于以下代码,它偶尔会崩溃:

问题是,在执行第二行时,该文件夹可能已经存在,并且会报错:

这是因为脚本多次同时启动,第三方代码我无法控制。

代码(在我尝试修复错误之前)可以在这里找到,在 github

我不能使用tempfile.mkstemp,因为它通过使用随机命名的目录(此处为 tempfile.py 源)来解决竞争条件,这会破坏缓存的目的。

我不想简单地丢弃该错误,因为如果文件夹名称作为文件存在(不同的错误),则会引发相同的错误 Errno 17 错误,例如:

我不能使用threading.RLock,因为代码是从多个进程中调用的。

因此,我尝试编写一个简单的基于文件的锁(可以在此处找到该版本),但这有一个问题:它会在上一级创建锁文件,因此/tmp/example.lockfor /tmp/example/,如果您/tmp/用作缓存目录(因为它尝试做/tmp.lock)..

简而言之,我需要将urllib2响应缓存到磁盘。为此,我需要以多进程安全的方式访问一个已知目录(如果需要,创建它)。它需要在 OS X、Linux 和 Windows 上运行。

想法?我能想到的唯一替代解决方案是使用 SQLite3 存储而不是文件重写缓存模块。

0 投票
6 回答
37916 浏览

python - django中计数器的原子增量

我试图在 Django 中原子地增加一个简单的计数器。我的代码如下所示:

如果我正确理解 Django,这应该将函数包装在事务中并使增量原子化。但它不起作用,并且计数器更新中存在竞争条件。如何使这段代码成为线程安全的?

0 投票
3 回答
3326 浏览

multithreading - x86 上的字撕裂

在什么情况下让两个不同的线程同时写入 x86 上同一数组的相邻元素是不安全的?我知道在某些具有疯狂内存模型的类似 DS9K 的架构上,这可能会导致字撕裂,但在 x86 上,单个字节是可寻址的。例如,在 D 编程语言real中是 x86 上的 80 位浮点类型。执行以下操作是否安全:

注意:我知道,即使这是安全的,它有时也会导致缓存的错误共享问题,从而导致性能下降。但是,对于我想到的用例,写入将很少见,以至于这在实践中并不重要。

编辑:不要担心读回写入的值。假设是在读取任何值之前会有同步。我只关心这样的安全性。

0 投票
5 回答
501 浏览

multithreading - 原子指令和变量更新可见性

在最常见的平台上(最重要的是 x86;我知道有些平台的内存模型非常困难,几乎不能保证对多线程有用,但我不关心罕见的反例),下面的代码安全吗?

线程 1:

线程 2:

假设原子操作的标准、合理实现:

  1. 线程 1 的分配是否保证在被调用someVariable之前完成?atomicSet()
  2. 如果线程 2 以原子方式读取,是否保证someVariable在调用之前看到分配?doMoreStuff()stuffDoneFlag

编辑:

  1. 我正在使用的原子操作的实现LOCK在每个操作中都包含 x86 指令,如果有帮助的话。
  2. 假设stuffDoneFlag以某种方式正确清除。怎么样并不重要。
  3. 这是一个非常简化的例子。我以这种方式创建它,这样您就不必了解问题的整个背景来回答它。我知道它没有效率。
0 投票
5 回答
5099 浏览

c - [APUE]fork后parent和child共享同一个文件偏移量吗?

在 APUE 第 8.3 节fork function中,关于父进程和子进程之间的文件共享,
它说:It is important that the parent and the child share the same file offset.

在第 8.9 节中Race Conditions,有一个例子:父母和孩子都写入
一个在调用 fork 函数之前打开的文件。该程序包含一个竞争条件,
因为输出取决于内核运行进程的顺序以及每个进程运行的时间。

但是在我的测试代码中,输出是重叠的。

[Langzi@Freedom apue]$ cat race.out
this is a long long outputhis is a long long output from parent

似乎父项和子项具有单独的文件偏移量,而不是共享相同的偏移量。

我的代码有错误吗?还是我误解了共享偏移量的含义?
任何建议和帮助将不胜感激。

以下是我的代码:

0 投票
1 回答
9826 浏览

c# - 竞争条件 / TextWriterTraceListener

从多线程记录到文件时,我有一些看起来像竞争条件的东西。

1) 我有一个自定义记录器类 (ConfigurableTraceLogger),它由我的应用程序中的多个线程共享。它有很多包装函数,它们都调用主核心函数

如您所见,我的类只是将不同的 TraceListner-derved 类存储在集合 _listeners 中。基本上只有控制台和文本文件侦听器。TraceData 的作用是获取类别名称(即记录启动)并找到正确的侦听器。所有监听器都由配置文件名定义

现在我的集合中也有我的自定义侦听器

该自定义类只覆盖一个属性。

当我在 5 到 10 分钟后启动我的应用程序时,我在通话中遇到异常

例外是说:

“复制内存时检测到可能的 I/O 竞争条件。默认情况下,I/O 包不是线程安全的。在多线程应用程序中,必须以线程安全的方式访问流,例如 TextReader 的返回的线程安全包装器或 TextWriter 的 Synchronized 方法。这也适用于 StreamWriter 和 StreamReader 等类。

之后,我在同一次调用中不断收到第二个异常

例外

计数不能小于零。参数名称:count 堆栈跟踪:" at System.String.CopyTo(Int32 sourceIndex, Char[] destination, Int32 destinationIndex, Int32 count)\r\n at System.IO.StreamWriter.Write(String value)\r\n at System.Diagnostics.TextWriterTraceListener.Write(String message)\r\n 在 System.Diagnostics.TraceListener.WriteHeader(String source, TraceEventType eventType, Int32 id)\r\n 在 System.Diagnostics.TraceListener.TraceData(TraceEventCache eventCache, String source, TraceEventType eventType, Int32 id, Object data)\r\n at Jfc.Configuration.ConfigurableTraceLogger.TraceData(String category, TraceEventType type, EventId id, String prefix, String format, Object[] args)"

在我看来,我的类和对 TraceData 的调用都不是线程安全的。但是 ConfigurableTextWriterTraceListener 毕竟据说是线程安全的。但是,我在运行时检查了我的 TextWriterTraceListener 派生类的 IsThreadSafe 属性,它是错误的。我试图找出问题出在哪里。

0 投票
1 回答
317 浏览

c# - FileSystemWatcher 优先级

我正在寻找使用 c# 中的 FileSystemWatcher 监视文件夹以创建事件。问题是另一个第 3 方进程也在监视该文件夹,我需要(如果可能)让我的进程在第 3 方进程之前接收创建事件。

有没有办法在托管或非托管代码中为我的进程赋予更高的优先级?