lis*_*tor 8 multithreading atomic raku
我有 20 个线程,它们都是从读取一个巨大的数据数组开始的。大多数情况下,代码运行顺利。然而,偶尔,如果没有可重现的模式,一两个线程会说没有数据。
我认为这可能是读取巨大数组时线程之间的竞争条件。我计划实施睡眠例程或原子锁。但是从内存块读取时不应该发生竞争条件,对吗?
TL;DR您的阵列是否100% 渴望?
摘自@jnthn对 SO 问题的回答是否安全,在线程之间共享数组?并添加我自己的斜体和粗体重点:
并发操作 可变大小数组 只读,非惰性 安全的 读/写或 懒惰 不安全 ...
它是唯一安全的,如果[阵列]将只读取从期间他们正在共享[和] 如果他们不懒(虽然给数组赋值大多渴望,你可能不会打偶然的情况下) .
鉴于以上都是福音(或下一个最好的事情),而且非常合乎逻辑,我猜你的数组不是 100% 渴望的。那个和/或有一个 Raku(do) 错误。
总结一下,你的情况是:
任何一个
你需要修复你的代码
您之前没有注意到您的阵列不是 100% 渴望的。您需要在第一次尝试读取懒惰写入的数据之前通过消除它来解决懒惰问题。
@array.elems在第一次尝试读取之前尝试写入(这会强制立即具体化整个数组)。(或eager在正确的位置插入一个显式。)这能解决问题吗?
或者
Raku(做)有一个错误
要么核心开发人员之前没有注意到并记录它,要么它已被记录在一个错误队列中而我们/我未能找到它。