作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个需要处理的巨大数据文件(接近 4T)。我在我的 4 核 CPU 上使用 4 个线程。第一个线程分析文件的第一季度,依此类推。所有线程在分析完自己四分之一的数据文件的部分后,都需要将其结果添加到相同的单个哈希和单个数组中。那么,哈希和数组的“push”、“pop”、“shift”和“unshift”操作是原子的和线程安全的,还是我不得不求助于信号量等更复杂的机制?
最佳答案
不,它们既不是原子的也不是线程安全的,多线程使用会导致崩溃或数据不一致。
也就是说,即使是这样,在同一数据结构上涉及大量争用的设计也会随着您添加更多线程而难以扩展。这是因为硬件在面对并行性时的工作方式;简要地:
OO::Monitors
这样的模块。 ,您可以在其中将散列封装在一个对象中并在边界处完成锁定。
push
es 或类似的每秒,但是,我建议寻找替代设计。例如:
start
触发每个 worker ,返回 Promise
.把 Promise
s 成一个数组。 Promise
返回它产生的项目的数组或散列。 my @all-results = flat await @promises;
或类似的足以将所有结果收集在一起。 关于multithreading - 哈希和数组的推送和弹出操作是原子的和线程安全的吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61354013/
我是一名优秀的程序员,十分优秀!