问题标签 [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.
linux - 同步 shell 脚本执行
shell 脚本的修改版本将音频文件从 FLAC 转换为 MP3 格式。该计算机具有四核 CPU。该脚本使用以下命令运行:
这会将flac
目录中的 FLAC 文件(文件名中没有空格)转换为目录中的 MP3 文件mp3
(与 同级flac
)。如果目标 MP3 文件已存在,则脚本会跳过该文件。
问题是有时脚本的两个实例几乎同时检查是否存在同一个 MP3 文件,从而导致 MP3 文件损坏。
您将如何多次运行脚本(即每个内核一次),而不必在每个命令行上指定不同的文件集,并且不覆盖工作?
更新 - 最小竞争条件
该脚本使用以下锁定机制:
但是,这仍然留下了竞争条件。
jquery - jQuery远程验证竞争条件
我在与 jQuery 表单插件结合使用的 jQuery 验证插件和远程验证规则方面遇到问题。
所以我使用jQuery表单插件拦截表单提交,如果验证失败,则表单不提交。但是,如果远程规则已经被验证(等待来自服务器的回答),无论如何都会发送表单。
如果它在一切正常之前或之后,我对表格的其他规则也是如此。但是,如果我在远程规则的 GET 中间,则 $('#myform').validate.form() 将返回 true,并提交表单。
所以代码看起来像这样:
有没有办法强制等待挂起的远程验证?
或者也许我可以在验证规则中只留下'onsubmit:true',所以我可以确保验证只在提交时发生并等待完成,然后再返回validate().form()的值,但这是我的最后一个采取。
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?
谢谢。
python - 在 Python 中创建竞争条件文件夹
我有一个 urllib2 缓存模块,由于以下代码,它偶尔会崩溃:
问题是,在执行第二行时,该文件夹可能已经存在,并且会报错:
这是因为脚本多次同时启动,第三方代码我无法控制。
代码(在我尝试修复错误之前)可以在这里找到,在 github
我不能使用tempfile.mkstemp,因为它通过使用随机命名的目录(此处为 tempfile.py 源)来解决竞争条件,这会破坏缓存的目的。
我不想简单地丢弃该错误,因为如果文件夹名称作为文件存在(不同的错误),则会引发相同的错误 Errno 17 错误,例如:
我不能使用threading.RLock
,因为代码是从多个进程中调用的。
因此,我尝试编写一个简单的基于文件的锁(可以在此处找到该版本),但这有一个问题:它会在上一级创建锁文件,因此/tmp/example.lock
for /tmp/example/
,如果您/tmp/
用作缓存目录(因为它尝试做/tmp.lock
)..
简而言之,我需要将urllib2
响应缓存到磁盘。为此,我需要以多进程安全的方式访问一个已知目录(如果需要,创建它)。它需要在 OS X、Linux 和 Windows 上运行。
想法?我能想到的唯一替代解决方案是使用 SQLite3 存储而不是文件重写缓存模块。
python - django中计数器的原子增量
我试图在 Django 中原子地增加一个简单的计数器。我的代码如下所示:
如果我正确理解 Django,这应该将函数包装在事务中并使增量原子化。但它不起作用,并且计数器更新中存在竞争条件。如何使这段代码成为线程安全的?
multithreading - x86 上的字撕裂
在什么情况下让两个不同的线程同时写入 x86 上同一数组的相邻元素是不安全的?我知道在某些具有疯狂内存模型的类似 DS9K 的架构上,这可能会导致字撕裂,但在 x86 上,单个字节是可寻址的。例如,在 D 编程语言real
中是 x86 上的 80 位浮点类型。执行以下操作是否安全:
注意:我知道,即使这是安全的,它有时也会导致缓存的错误共享问题,从而导致性能下降。但是,对于我想到的用例,写入将很少见,以至于这在实践中并不重要。
编辑:不要担心读回写入的值。假设是在读取任何值之前会有同步。我只关心这样写的安全性。
multithreading - 原子指令和变量更新可见性
在最常见的平台上(最重要的是 x86;我知道有些平台的内存模型非常困难,几乎不能保证对多线程有用,但我不关心罕见的反例),下面的代码安全吗?
线程 1:
线程 2:
假设原子操作的标准、合理实现:
- 线程 1 的分配是否保证在被调用
someVariable
之前完成?atomicSet()
- 如果线程 2 以原子方式读取,是否保证
someVariable
在调用之前看到分配?doMoreStuff()
stuffDoneFlag
编辑:
- 我正在使用的原子操作的实现
LOCK
在每个操作中都包含 x86 指令,如果有帮助的话。 - 假设
stuffDoneFlag
以某种方式正确清除。怎么样并不重要。 - 这是一个非常简化的例子。我以这种方式创建它,这样您就不必了解问题的整个背景来回答它。我知道它没有效率。
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
似乎父项和子项具有单独的文件偏移量,而不是共享相同的偏移量。
我的代码有错误吗?还是我误解了共享偏移量的含义?
任何建议和帮助将不胜感激。
以下是我的代码:
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 属性,它是错误的。我试图找出问题出在哪里。
c# - FileSystemWatcher 优先级
我正在寻找使用 c# 中的 FileSystemWatcher 监视文件夹以创建事件。问题是另一个第 3 方进程也在监视该文件夹,我需要(如果可能)让我的进程在第 3 方进程之前接收创建事件。
有没有办法在托管或非托管代码中为我的进程赋予更高的优先级?