【发布时间】:2010-07-31 13:01:22
【问题描述】:
- 我有一个包含 250k 个实体(大小为 20 字节)和 4 个线程的数组。
- 每个线程修改约 100k 个随机实体(这意味着,您无法预测它将接触哪些实体)。它可以多次修改同一个实体。
- 每个实体最多可修改 10 次。
- 修改大约需要 10-6 秒。
- 每个实体都被多个线程修改
最后两点是最重要的事实。第 5 点意味着我需要一种机制来保护我的实体不因并发访问/修改而损坏。第 4 点让我担心,考虑到获取锁的时间跨度很短,像互斥锁这样阻塞线程的经典锁定机制是否会产生大量开销。
我想出了两个想法:
- 使用自旋锁来克服开销(假设我对开销的假设首先是正确的)。
- 为每个线程提供一个数组的本地副本,它可以在不中断的情况下进行修改。在所有线程完成后,将所有数组合并为一个。这是可能的,因为如果一个实体有多个副本,我可以选择一个获胜者。
你推荐什么?你同意我的一个想法还是你推荐别的东西?如果我将数字更改为,您的建议是否会改变?:
- 100 万个实体
- 8 线程
- ~500k 随机访问
- 每个实体约 100 次修改
还请指点我在 C#/.Net 中的实现。提前致谢。
其他信息
实体是值类型(结构)。我无法为每个写入操作创建新对象 - 只能修改现有原语。
【问题讨论】:
-
我不得不问,为什么会有多个线程呢?
-
@chibacity 他们处理一个更大的数据集(3M+),这个处理的结果必须存储在我的数组中。另一个数据集可以独立处理,因此不会发生冲突。但是,尝试将结果存储在数组中时可能会发生冲突。
标签: .net concurrency locking