读取大数据块时是否会出现竞争条件?

Do race conditions occur while reading large data blocks?

我有 20 个线程,它们都是从读取一个巨大的数据数组开始的。大多数时候代码 运行 很顺利。但是,偶尔,如果没有可重现的模式,一两个线程会说没有数据。

我认为这可能是读取巨大数组时线程之间的竞争条件。我计划实施睡眠例程或原子锁。但是从内存块读取时不应该出现竞争条件,对吗?

TL;DR 你的数组是100% eager?

摘录到 SO 问题 在线程之间共享数组安全吗? 并添加我自己的 斜体粗体 强调:

Concurrent operations Variable size array
Read-only, non-lazy Safe
Read/write or lazy Not safe

...

it is only safe if [arrays] will only be read from during the period they are being shared [and] if they're not lazy (though given array assignment is mostly eager, you're not likely to hit that situation by accident).


鉴于以上内容既是福音(或次佳的事情),又非常合乎逻辑,我猜你的数组不是 100% 急切的。 and/or 存在 Raku(do) 错误。


综上所述,您的情况是:

任一个

  1. 您需要修复代码

    您之前没有注意到您的阵列不是 100% 急切的。您需要在第一次尝试读取懒惰写入的数据之前通过消除它来解决懒惰问题。

    在第一次尝试读取之前尝试写入 @array.elems(强制立即具体化整个数组)。 (或者在正确的位置插入明确的 eager。)这样可以解决问题吗?

  1. Raku(do) 中存在错误

    要么核心开发人员之前没有注意到并记录它,要么它已被记录在其中一个错误队列中,但 we/I 未能找到它。