问题标签 [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.
java - file.createNewFile() 在实际创建时间之前创建最后修改时间的文件
我正在使用JPoller来检测对特定目录中文件的更改,但它丢失了文件,因为它们最终的时间戳早于它们的实际创建时间。这是我的测试方式:
这就是我得到的输出:
结果是一个竞争条件:
- JPoller 将上次检查的时间记录为 xyz...123
- 在 xyz...456 创建的文件
- 文件最后修改的时间戳实际上读取 xyz...000
- JPoller 查找时间戳大于 xyz...123 的新/更新文件
- JPoller 忽略新添加的文件,因为 xyz...000 小于 xyz...123
- 我把头发拉了一会儿
我尝试深入研究代码,但最终都lastModified()
解决createNewFile()
了本机调用,所以我只剩下很少的信息了。
因为test.9
,我损失了 957 毫秒。我可以期待什么样的准确性?我的结果会因操作系统或文件系统而异吗?建议的解决方法?
注意:我目前正在使用 XFS 文件系统运行 Linux。我在其中编写了一个快速程序,C
stat系统调用显示st_mtime
为truncate(xyz...000/1000)
.
更新:我在带有 NTFS 的 Windows 7 上运行了与上面相同的程序,它确实保持了完整的毫秒精度。MSDN 链接@mdma 提供了进一步的说明,FAT 文件系统对于分辨率为 10 毫秒的创建是准确的,但对于访问仅准确到 2 秒。因此,这确实取决于操作系统。
c# - ASP.NET:业务逻辑中的竞争条件问题
我有以下问题:
我们系统的产品在发布时只允许购买 X 次。购买时,中央采购算法会检查存在多少订单,如果低于 X 则继续购买。
在伪 C# 代码中:
问题是,有时当对某种产品的需求量很大时,会同时发生大量请求,并且注册的数量超过 MAX_ORDERS。这种情况大约每年发生一次:(。
解决这个问题的最佳解决方案是什么?我正在使用 ASP.NET/C#、Ling2SQL 和 MSSQL。我们每天有 1000> 个订单。按照请求的顺序处理订单很重要。
到目前为止我想出的解决方案:
一个全局互斥锁?
每个产品一个互斥体存储在哈希表中,访问函数如下:
/li>
其中 mutexTbl 是一个哈希表。在这里,我还没有弄清楚如何以一种好的方式丢弃旧的互斥锁。
在 Order 表上使用 T-SQL INSERT 触发器来检查有多少订单:
CREATE TRIGGER Triggers_OrderInsertTrigger ON Orders AFTER INSERT AS IF /* 检查是否有很多订单 */ BEGIN RAISERROR ('Too many orders', 16, 1); 回滚交易;返回结束;
但我不太喜欢这两种解决方案。你会如何解决这个问题?
java - jsp/servlets 应用程序中的 java 方法和竞争条件
假设我有一个被调用的方法doSomething()
,并且我想在多线程应用程序中使用这个方法(每个 servlet 都继承自 HttpServlet)。我想知道在以下情况下是否会出现竞争条件:
doSomething()
不是静态方法,它将值写入数据库。doSomething()
是静态方法,但它不会将值写入数据库。
我注意到我的应用程序中的许多方法可能会导致竞争条件或脏读/写。例如,我有一个投票系统,对于每个投票操作,某种方法将更改该投票的单个单元格值,如下所示:
JSP/Servlets 应用程序会自己解决这些问题,还是我必须自己解决所有这些问题?
谢谢..
mysql - 事务是否会停止 MySQL 中的所有竞争条件问题?
考虑这种情况:
- 开始交易
- 使用 auto_increment 键向表中插入 20 条记录
- 获取第一个插入 id(假设它是
153
) - 更新该表中的所有记录
id >= 153
- 犯罪
第4步安全吗?
也就是说,如果另一个请求几乎同时进来,并且在上面的第 2 步之后,但在第 4 步之前,又插入了 20 条记录,会不会出现竞态条件?
java - 导致竞争条件的长时间运行方法
我对休眠比较陌生,所以请温柔一点。我在长时间运行的方法(约 2 分钟长)和更改存储在数据库中的对象上的状态字段的值时遇到问题。下面的伪代码应该有助于解释我的问题。
伪代码不需要太多解释。我希望 doSomethingAndTakeALongTime() 运行,但前提是它的状态为“就绪”。每当 doSomethingAndTakeALongTime() 需要 2 分钟才能完成并且对事物状态字段的更改在离开 foo() 之前不会持久保存到数据库时,就会出现我的问题。因此,另一个用户可以在这 2 分钟内提出请求,并且 if 语句将评估为 true。
我已经尝试过手动更新字段并刷新会话,但它似乎不起作用。我不知道从这里做什么,并希望得到任何帮助。
PS:我的休眠会话由 spring 管理。
c - 在没有此标志的系统上模拟 O_NOFOLLOW 的好方法是什么?
我希望能够安全地在不支持的系统上open
进行O_CREAT | O_WRONLY | O_TRUNC | O_NOFOLLOW
模拟。我可以通过以下方式实现我的要求:O_CREAT | O_WRONLY | O_APPEND | O_NOFOLLOW
O_NOFOLLOW
但随后我介绍了一个竞争条件,可能还有一个安全问题。
我想过可能创建一个只有用户能够写入的虚拟文件,有点像touch
ing filename
,进行lstat
检查,然后chmod
在我完成写入后使用(以更正文件模式位),但我可能会忽略一些主要的东西(例如,如果文件filename
存在,不是常规文件,或者已经是符号链接)。
你怎么看?
javascript - javascript真的很奇怪的行为
我有以下代码
我遇到了一些非常奇怪的情况,在最后一个代码块中出现错误,但打印的位置显示msg.position
实际上等于txtArea.value.length
. 这只发生在 1% 的时间里,就好像我的代码中有某种竞争条件,在第二个 if 语句中两者不相等,但在我打印错误消息时相等。
有任何想法吗?
c - 模拟 O_NOFOLLOW (2):这种其他方法安全吗?
作为这个问题的后续问题,我想到了另一种方法,它建立在@caf's answer的基础上,用于我想附加到文件name
并在它不存在时创建它的情况。
这是我想出的:
- 在与 file 相同的文件系统上的系统临时目录中创建一个模式为 0700 的临时目录
name
。 name
以只读方式打开文件和O_CREAT
.name
如果它是符号链接,则操作系统可能会跟随。用于在临时目录中创建临时文件,并尝试使用to file创建的临时文件。以只读方式mkstemp
rename
mkstemp
name
打开文件和.name
O_CREAT | O_EXCL
- 反复尝试对
name
临时目录中的临时名称进行硬链接。如果link
由于“链接目标存在”(errno)以外的错误而导致调用失败EEXIST
,则退出。(也许有人过来并删除了 的文件name
,谁知道?) lstat
在temp_name
(硬链接)上使用。如果S_ISLNK(lst.st_mode)
,则退出。open
temp_name
用于编写和附加 (O_WRONLY | O_APPEND
)。- 把一切都写出来。关闭文件描述符。
unlink
硬链接。- 删除临时目录。
(顺便说一下,所有这些都是针对我正在开发的一个开源项目。您可以在此处查看我实施这种方法的源代码。)
这个过程对符号链接攻击安全吗?例如,恶意进程是否有可能name
在检查期间确保 inode for 代表常规文件lstat
,然后使 inode 成为符号链接,而temp_name
硬链接现在指向新的符号链接?
我假设恶意进程不会影响temp_name
.
编辑: link
不会覆盖目标,因此创建“占位符”临时文件不是我想要做的。我已经更新了我的代码并更新了上述步骤。
EDIT2:我现在使用步骤 2 的替代过程来创建文件name
,如果它不存在,我认为它不会受到这个问题的影响。
EDIT3:甚至比将临时的、空的、常规的文件重命名为name
,这也具有取消链接的效果name
,然后重命名,我可以打开文件O_RDONLY | O_CREAT | O_EXCL
。
状态的 POSIX 标准open
:
如果设置 和 并
O_EXCL
命名符号链接,则无论符号链接的内容如何,都将失败并设置为。O_CREAT
path
open()
errno
EEXIST
c++ - 函数中的静态对象是否会引入潜在的竞争条件?
我很好奇以下代码:
上面的代码中是否存在可能的竞争条件?具体来说,编译器是否可能生成相当于以下“幕后”的代码?
...在这种情况下,如果两个线程几乎同时调用 MyFunction(),那么 _myArray 可能会被分配两次,从而导致内存泄漏?
还是以某种方式正确处理?
php - Memcache - 如何在保持价值一致性的情况下延长价值到期?
在 PHP 中查看这段简单的代码:
现在想象一下,递增的“第 2 部分”是从许多独立客户端调用的,并且每个客户端都获得了其唯一的 ID。
问题是:如何在保持价值一致性的情况下延长价值“id”的到期时间?请记住,每次都有一些客户可以增加价值。
一些想法如何解决这个问题:
尽量快
但是这里是 get 和 set 之间的时间漏洞,其他客户端可以更改值。(?)
使用信号量,例如:
没多大效...
使用 memcache_delete:
如果您两次调用它,文档就会缺少发生的事情。它是否应该延长第一次通话的到期时间?
最后一个令人惊讶的例子(你自己试试):
返回我: