multithreading - 读取大数据块时是否会出现竞态条件?
问题描述
我有 20 个线程,它们都是从一个巨大的数据数组中读取的。大多数情况下,代码运行顺畅。但是,偶尔,如果没有可重现的模式,一两个线程会说没有数据。
我认为这可能是读取巨大数组时线程之间的竞争条件。我计划实现睡眠例程或原子锁。但是从内存块读取时不应该出现竞争条件,对吧?
解决方案
TL;DR您的阵列是否100% 渴望?
摘自@jnthn对 SO 问题的回答在线程之间共享数组是否安全?并添加我自己的斜体和粗体强调:
并发操作 可变大小数组 只读,非惰性 安全的 读/写或懒惰 不安全 ...
只有在[arrays]仅在它们被共享期间被读取[ and ] 如果它们不是懒惰的情况下才安全(尽管给定的数组分配大多是急切的,但您不太可能偶然遇到这种情况) .
鉴于上述内容既是福音(或次佳),又非常合乎逻辑,我猜你的数组并不是 100% 渴望的。那和/或有一个 Raku(do) 错误。
总结一下,你的情况是:
任何一个
你需要修复你的代码
您以前没有注意到您的阵列不是 100% 渴望的。您需要通过在第一次尝试读取延迟写入的数据之前消除它来解决延迟问题。
在第一次尝试读取之前尝试写入
@array.elems
(这会强制整个数组立即具体化)。(或者在正确的位置插入一个明确eager
的。)这能解决问题吗?
或者
Raku(do) 中有一个错误
要么核心开发人员以前没有注意到并记录它,要么它已被记录在一个错误队列中,我们/我没能找到它。
推荐阅读
- terraform - 使用地图查找将 Terraform 插值到 var
- javascript - Jquery MultiSelect Dropdown 无法正确处理来自 Ajax 调用的数据
- ruby - 在 Windows 10 上安装 Ruby 2.3.2
- c# - 连接到 Azure 文件存储上的 SQLite 数据库
- javascript - 无法匹配任何路由。角度误差?
- python - 如何对列表中的元素进行分组?
- python - 如何在 Matplotlib 中使用 Latex 正确编写“<”和“>”符号
- android - 如何强制 FileBackupAgent 运行?
- swift - 尝试与活动视图控制器共享文件中的 json 字符串
- android - Cordova + Vue.js:在严格模式之外尚不支持块范围的声明(let、const、函数、类)