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

java - file.createNewFile() 在实际创建时间之前创建最后修改时间的文件

我正在使用JPoller来检测对特定目录中文件的更改,但它丢失了文件,因为它们最终的时间戳早于它们的实际创建时间。这是我的测试方式:

这就是我得到的输出:

结果是一个竞争条件:

  1. JPoller 将上次检查的时间记录为 xyz...123
  2. 在 xyz...456 创建的文件
  3. 文件最后修改的时间戳实际上读取 xyz...000
  4. JPoller 查找时间戳大于 xyz...123 的新/更新文件
  5. JPoller 忽略新添加的文件,因为 xyz...000 小于 xyz...123
  6. 我把头发拉了一会儿

我尝试深入研究代码,但最终都lastModified()解决createNewFile()了本机调用,所以我只剩下很少的信息了。

因为test.9我损失了 957 毫秒。我可以期待什么样的准确性?我的结果会因操作系统或文件系统而异吗?建议的解决方法?

注意:我目前正在使用 XFS 文件系统运行 Linux。我在其中编写了一个快速程序,Cstat系统调用显示st_mtimetruncate(xyz...000/1000).

更新:我在带有 NTFS 的 Windows 7 上运行了与上面相同的程序,它确实保持了完整的毫秒精度。MSDN 链接@mdma 提供了进一步的说明,FAT 文件系统对于分辨率为 10 毫秒的创建是准确的,但对于访问仅准确到 2 秒。因此,这确实取决于操作系统。

0 投票
3 回答
269 浏览

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); 回滚交易;返回结束;

但我不太喜欢这两种解决方案。你会如何解决这个问题?

0 投票
5 回答
2419 浏览

java - jsp/servlets 应用程序中的 java 方法和竞争条件

假设我有一个被调用的方法doSomething(),并且我想在多线程应用程序中使用这个方法(每个 servlet 都继承自 HttpServlet)。我想知道在以下情况下是否会出现竞争条件:

  1. doSomething()不是静态方法,它将值写入数据库。
  2. doSomething()静态方法,但它不会将值写入数据库。

我注意到我的应用程序中的许多方法可能会导致竞争条件或脏读/写。例如,我有一个投票系统,对于每个投票操作,某种方法将更改该投票的单个单元格值,如下所示:

JSP/Servlets 应用程序会自己解决这些问题,还是我必须自己解决所有这些问题?

谢谢..

0 投票
2 回答
2874 浏览

mysql - 事务是否会停止 MySQL 中的所有竞争条件问题?

考虑这种情况:

  1. 开始交易
  2. 使用 auto_increment 键向表中插入 20 条记录
  3. 获取第一个插入 id(假设它是153
  4. 更新该表中的所有记录id >= 153
  5. 犯罪

第4步安全吗?

也就是说,如果另一个请求几乎同时进来,并且在上面的第 2 步之后,但在第 4 步之前,又插入了 20 条记录,会不会出现竞态条件?

0 投票
2 回答
362 浏览

java - 导致竞争条件的长时间运行方法

我对休眠比较陌生,所以请温柔一点。我在长时间运行的方法(约 2 分钟长)和更改存储在数据库中的对象上的状态字段的值时遇到问题。下面的伪代码应该有助于解释我的问题。

伪代码不需要太多解释。我希望 doSomethingAndTakeALongTime() 运行,但前提是它的状态为“就绪”。每当 doSomethingAndTakeALongTime() 需要 2 分钟才能完成并且对事物状态字段的更改在离开 foo() 之前不会持久保存到数据库时,就会出现我的问题。因此,另一个用户可以在这 2 分钟内提出请求,并且 if 语句将评估为 true。

我已经尝试过手动更新字段并刷新会话,但它似乎不起作用。我不知道从这里做什么,并希望得到任何帮助。

PS:我的休眠会话由 spring 管理。

0 投票
1 回答
1438 浏览

c - 在没有此标志的系统上模拟 O_NOFOLLOW 的好方法是什么?

我希望能够安全地在不支持的系统上open进行O_CREAT | O_WRONLY | O_TRUNC | O_NOFOLLOW模拟。我可以通过以下方式实现我的要求:O_CREAT | O_WRONLY | O_APPEND | O_NOFOLLOWO_NOFOLLOW

但随后我介绍了一个竞争条件,可能还有一个安全问题。

我想过可能创建一个只有用户能够写入的虚拟文件,有点像touching filename,进行lstat检查,然后chmod在我完成写入后使用(以更正文件模式位),但我可能会忽略一些主要的东西(例如,如果文件filename存在,不是常规文件,或者已经是符号链接)。

你怎么看?

0 投票
5 回答
218 浏览

javascript - javascript真的很奇怪的行为

我有以下代码

我遇到了一些非常奇怪的情况,在最后一个代码块中出现错误,但打印的位置显示msg.position实际上等于txtArea.value.length. 这只发生在 1% 的时间里,就好像我的代码中有某种竞争条件,在第二个 if 语句中两者不相等,但在我打印错误消息时相等。

有任何想法吗?

0 投票
1 回答
298 浏览

c - 模拟 O_NOFOLLOW (2):这种其他方法安全吗?

作为这个问题的后续问题,我想到了另一种方法,它建立在@caf's answer的基础上,用于我想附加到文件name并在它不存在时创建它的情况。

这是我想出的:

  1. 在与 file 相同的文件系统上的系统临时目录中创建一个模式为 0700 的临时目录name
  2. name以只读方式打开文件和O_CREAT. name如果它是符号链接,则操作系统可能会跟随。用于在临时目录中创建临时文件,并尝试

    使用to file创建的临时文件。mkstemprenamemkstempname以只读方式

    打开文件和.nameO_CREAT | O_EXCL
  3. 反复尝试对name临时目录中的临时名称进行硬链接。如果link由于“链接目标存在”(errno)以外的错误而导致调用失败EEXIST,则退出。(也许有人过来并删除了 的文件name,谁知道?)
  4. lstattemp_name(硬链接)上使用。如果S_ISLNK(lst.st_mode),则退出。
  5. open temp_name用于编写和附加 ( O_WRONLY | O_APPEND)。
  6. 把一切都写出来。关闭文件描述符。
  7. unlink硬链接。
  8. 删除临时目录。

(顺便说一下,所有这些都是针对我正在开发的一个开源项目。您可以在此处查看我实施这种方法的源代码。)

这个过程对符号链接攻击安全吗?例如,恶意进程是否有可能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_CREATpathopen()errnoEEXIST

0 投票
2 回答
252 浏览

c++ - 函数中的静态对象是否会引入潜在的竞争条件?

我很好奇以下代码:

上面的代码中是否存在可能的竞争条件?具体来说,编译器是否可能生成相当于以下“幕后”的代码?

...在这种情况下,如果两个线程几乎同时调用 MyFunction(),那么 _myArray 可能会被分配两次,从而导致内存泄漏?

还是以某种方式正确处理?

0 投票
1 回答
1664 浏览

php - Memcache - 如何在保持价值一致性的情况下延长价值到期?

在 PHP 中查看这段简单的代码:

现在想象一下,递增的“第 2 部分”是从许多独立客户端调用的,并且每个客户端都获得了其唯一的 ID。

问题是:如何在保持价值一致性的情况下延长价值“id”的到期时间?请记住,每次都有一些客户可以增加价值。

一些想法如何解决这个问题:

尽量快

但是这里是 get 和 set 之间的时间漏洞,其他客户端可以更改值。(?)

使用信号量,例如:

没多大效...

使用 memcache_delete:

如果您两次调用它,文档就会缺少发生的事情。它是否应该延长第一次通话的到期时间?

最后一个令人惊讶的例子(你自己试试):

返回我: